2017-06-01 62 views
1

在JAXB中,可以使用@XmlElementWrapper屬性指定要包裝元素集合的標記。但是,即使集合爲空(即使集合爲null,也不會出現這些包裝標籤)。如果集合是空的,有沒有辦法讓JAXB省略包裝標籤?在集合上使用適配器似乎不起作用,因爲JAXB將其解釋爲意味着它應該將適配器應用於集合中的每個元素。集合爲空時忽略JAXB中的包裝器標記

回答

1

您可以通過使用 Marshal Event Callbacks以一種有點冒失的方式強制執行所需的行爲。

@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 
} 

Marshal Event Callbacks 描述實際上有2的替代方法如何使用名帥回調:

  1. beforeMarshal和/或afterMarshal法直接到類,僅此而已。 (這是更簡單的方法,這就是爲什麼我在我的答案中使用了這個)。
  2. 創建一個Marshaller.Listener並在那裏寫beforeMarshalafterMarshal方法。然後,您需要在Marshaller中註冊該聽衆。
1

您可以使用Marshaller

您可以添加偵聽器機制/設置監聽象下面這樣:

jaxbMarshaller.setListener(new Listener() 
{ 
    @Override 
    public void beforeMarshal(Object source) 
    { 
     if (source instanceof MyCollectionWrapper) 
     { 
      MyCollectionWrapper wrapper = (MyCollectionWrapper)source; 
      if (wrapper.getCollection() != null && wrapper.getCollection().isEmpty()) 
      { 
       wrapper.setCollection(null); 
      } 
     } 

    } 
}); 

其中MyCollectionWrapper是代表你的包裝類的類。

當收集爲空時,應該刪除包裝標籤。