java-在解组操作期间将nil =“ true”转换为null
作者:互联网
我从服务器接收XML,该服务器的模式将几乎每个元素都指定为:
<xs:element name="myStringElementName" type="xs:string" nillable="true" minOccurs="0"/>
<xs:element name="myIntElementName" type="xs:int" nillable="true" minOccurs="0"/>
我正在尝试寻找一种干净的方法,以将接收到的,被标记为xsi:nil =“ true”的每个元素解组为JAXB对象时,将其转换为null.所以像这样:
<myIntElementName xsi:nil="true" />
应该导致我的JAXB对象的myIntElementName属性值为null,而不是JAILBElement对象的nil属性设置为true(或者类似的东西).我对发送给我使用nillable属性的XML的系统没有任何控制,因此我需要在接收到它时最终对其进行转换.
解决方法:
@XmlElement(nillable = true)
您只需要在字段/属性上指定@XmlElement(nillable = true)即可获得以下行为:
@XmlElement(nillable=true)
private String foo;
从XML模式生成
下面,我将演示如果您盯着XML模式,如何生成此映射.
XML模式(schema.xsd)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="foo">
<xs:complexType>
<xs:sequence>
<xs:element name="myStringElementName" type="xs:string"
nillable="true" minOccurs="0" />
<xs:element name="myIntElementName" type="xs:int"
nillable="true" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
为什么获得JAXBElement类型的属性
在模型中会生成类型JAXBElement的属性,因为您有一个可精简的元素,即minOccurs =“ 0”.使用JAXBElement可以使模型区分缺少的元素(属性为null)和存在nil =“ true”的元素(设置了nil标志的JAXBElement)之间的区别.
<xs:element name="myStringElementName" type="xs:string"
nillable="true" minOccurs="0" />
外部绑定文件(binding.xml)
可以指定一个外部绑定文件来告诉JAXB实现不要生成JAXBElement类型的任何属性.注意,这将使JAXB无法往返所有XML文档.
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="2.0"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
<jaxb:bindings>
<jaxb:globalBindings generateElementProperty="false"/>
</jaxb:bindings>
</jaxb:bindings>
XJC电话
以下是如何利用XJC调用中的外部绑定文件的示例
xjc -b binding.xml schema.xsd
生成模型(Foo)
生成的模型如下所示:
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"myStringElementName",
"myIntElementName"
})
@XmlRootElement(name = "foo")
public class Foo {
@XmlElement(nillable = true)
protected String myStringElementName;
@XmlElement(nillable = true)
protected Integer myIntElementName;
public String getMyStringElementName() {
return myStringElementName;
}
public void setMyStringElementName(String value) {
this.myStringElementName = value;
}
public Integer getMyIntElementName() {
return myIntElementName;
}
public void setMyIntElementName(Integer value) {
this.myIntElementName = value;
}
}
欲获得更多信息
> http://blog.bdoughan.com/2012/04/binding-to-json-xml-handling-null.html
标签:jaxb2,jaxb,xml-nil,xml,java 来源: https://codeday.me/bug/20191031/1979001.html