2017-06-01 16 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 
} 

どのようにマーシャルコールバックを使用するには、2つの代替の方法は実際にありますMarshal Event Callbacks で説明したように:

  1. は直接あなたのクラスにbeforeMarshalおよび/またはafterMarshal方法を入れて、それはそれです。 (これはもっと簡単な方法で、私はこれを私の答えに使ったのです)。
  2. Marshaller.Listenerを作成し、そこにbeforeMarshalafterMarshalメソッドを記述します。このリスナーをMarshallerに登録する必要があります。 MyCollectionWrapperがあなたのラッパークラスを表すクラスである

    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); 
          } 
         } 
    
        } 
    }); 
    

1

あなたが追加することができますMarshaller

のリスナーメカニズムを使用することができます/リスナー以下のように設定します。

これは、コレクションが空のときにラッパータグを削除する必要があります。

関連する問題