jaxb xs:element 忽略空列表

jaxb xs:element ignore empty list

我有一个类似

的模式文件
 <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/>

我怎样才能避免这种情况?

谢谢!! :)

@XmlElementWrapper
@XmlElement(name = "role")
protected List<Role> roles;

然后会发生以下情况之一:

  1. 如果 roles 包含您将获得的项目:

    <roles>
        <role>...</role>
        <role>...</role>
    </roles>
    
  2. 如果 roles 是一个空列表,您将得到:

    <roles/>
    
  3. 如果 roles 为空,则 roles 元素将不会出现。


了解更多信息

我在我的博客上写了更多关于这个的内容:


更新

I also use "dozer" to convert Object into another object, so empty list are never null. Is there no way to tell JAXB ignore empty list ?

您可以在您的域 class 上添加一些编组事件回调方法来调整编组前后的 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>();
    }
}