当集合为空时,省略JAXB中的包装器标签

cod*_*ker 2 java xml jaxb

在JAXB中,可以使用@XmlElementWrapper属性来指定用于包装元素集合的标记。但是,即使集合为空,这些包装标签也会出现(如果集合为,则不会出现null)。如果集合为空,有什么方法可以让JAXB省略包装器标签?在集合上使用适配器似乎无效,因为JAXB将此解释为意味着应将适配器应用于集合中的每个元素。

Tho*_*sch 5

您可以通过使用元帅事件回调以某种有点怪异的方式实施所需的行为 。

@XmlRootElement(name="example")
@XmlAccessorType(XmlAccessType.FIELD)
public class Example {

    @XmlElementWrapper(name="wrapper")
    @XmlElement(name="item")
    private List<Item> items;

    // invoked by Marshaller before marshalling
    private void beforeMarshal(Marshaller marshaller) {
         if (items != null && items.isEmpty())
            items = null;
    }

    // ... getters and setters
}
Run Code Online (Sandbox Code Playgroud)

元帅事件回调中所述, 实际上有两种使用元帅回调的替代方法:

  1. beforeMarshaland / or afterMarshal方法直接放入您的类,就是这样。(这是更简单的方法,这就是我在答案中使用它的原因)。
  2. 创建一个Marshaller.Listener并在其中编写beforeMarshalafterMarshal方法。然后,您需要在中注册此侦听器Marshaller