在Java,Json等中,您可以在对象属性中区分空列表和空列表。在XML中,它们通常都表示为“没有具有该属性名称的元素”,因此区别消失了。因此,在编组和解组Java对象时,此属性此后将始终有一个空列表。
例如,在基于xml的协议中描述更改时,区别特别重要,其中“ null”表示“请勿更改”,“空列表”表示“设置为空列表”。
所以问题是如何定义xsd和潜在的xjb(jaxb绑定)以定义能够区分两者的协议。
此类对象的普通xsd是
<complexType name="Object">
<sequence>
<element type="xs:string" name="id" minOccurs="0" maxOccurs="unbounded"/>
<sequence>
</complexType>
这将创建类似Java代码
public List<String> getIds() {
if (ids == null) {
ids = new ArrayList<>();
}
return this.ids;
}
因此,显然getIds永远不会返回null。但这很显然是这样,因为没有两个不同的xml,因此会将null或空列表都编组到
<Object>
<Object>
所以我的第一个想法是使用nillable:
<complexType name="Object">
<sequence>
<element type="xs:string" name="id"
minOccurs="0" maxOccurs="unbounded" nillable="true"/>
<sequence>
</complexType>
然后,空列表将如上所述,但是null可以描述为
<Object>
<id xsi:nil="true">
<Object>
但是,jaxb不尊重这一点,它将创建与上面相同的代码。
我的下一个ID是使用xsd列表类型:
<xs:simpleType name="IdListType">
<xs:list itemType="xs:string"/>
</xs:simpleType>
对象描述为
<complexType name="Object">
<sequence>
<element type="IdListType" name="ids" minOccurs="0"/>
<sequence>
</complexType>
然后,null可以写为
<Object>
<Object>
并以空白列表
<Object>
<ids></ids>
<Object>
但是,jaxb只会创建与上面相同的代码,甚至不会为IdListType创建Java类。
所以我只能使用类似的复杂列表数据类型
<complexType name=IdListType>
<sequence>
<element name="id" type="xs:string" minOccurs="0" maxOccurs="unbounded">
</sequence>
</complexType>
对象xsd如上。这会起作用,但是会在生成的代码以及协议中的线路上创建大量样板代码。
所以我的问题是:是否有一种更简单的方法,也许会使jaxb兑现所列xsds之一中的区别?