我有一个类似
的模式文件 <xs:complexType name="Autorisation">
<xs:sequence>
<xs:element name="roles" type="Roles"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Roles">
<xs:sequence>
<xs:element name="role" type="Role" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Role">
<xs:sequence>
<xs:element name="type" type="xs:int"/>
<xs:element name="dateDebut" type="xs:dateTime"/>
<xs:element name="dateFin" type="xs:dateTime"/>
</xs:sequence>
</xs:complexType>
它产生类似的东西:
@XmlElementWrapper
@XmlElement(name = "role")
protected List<Role> roles;
当我使用JAXB.marshal(input, Output);
创建一个带有空角色列表的xml文件时,生成的xml文件包含<role/>
我怎么能避免这种情况?
谢谢!! :)
答案 0 :(得分:0)
@XmlElementWrapper
@XmlElement(name = "role")
protected List<Role> roles;
然后会发生以下情况之一:
如果roles
包含您将获得的项目:
<roles>
<role>...</role>
<role>...</role>
</roles>
如果roles
是一个空列表,您将获得:
<roles/>
如果roles
为空,则不会显示roles
元素。
了解更多信息
我在博客上写了更多关于此的内容:
我还使用“dozer”将Object转换为另一个对象,所以为空 列表永远不会为空。有没有办法告诉JAXB忽略空列表?
您可以在域类中添加一些编组事件回调方法,以便在编组之前和之后调整List
属性(请参阅:https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/Marshaller.html#marshalEventCallback)。
void beforeMarshal(Marshaller) {
if(roles != null && roles.isEmpty()) {
roles = null;
}
}
void afterMmarshal(Marshaller) {
if(null == roles) {
roles = new ArrayList<Role>();
}
}