jaxb xs:element忽略空列表

时间:2015-01-21 17:47:39

标签: xml jaxb marshalling

我有一个类似

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

我怎么能避免这种情况?

谢谢!! :)

1 个答案:

答案 0 :(得分:0)

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

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

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

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

    <roles/>
    
  3. 如果roles为空,则不会显示roles元素。


  4. 了解更多信息

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


    更新

      

    我还使用“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>();
        }
    }