2017-06-01 1 views
1

In JAXB können Sie das @ XmlElementWrapper-Attribut verwenden, um Tags zum Umbrechen einer Sammlung von Elementen anzugeben. Diese Wrapper-Tags werden jedoch auch dann angezeigt, wenn die Auflistung leer ist (sie werden nicht angezeigt, wenn die Auflistung null ist). Gibt es eine Möglichkeit JAXB die Wrapper-Tags wegzulassen, wenn die Sammlung leer ist? Die Verwendung von Adaptern für die Sammlung scheint nicht zu funktionieren, da JAXB dies so interpretiert, dass es den Adapter auf jedes Element in der Sammlung anwenden sollte.Wrapper-Tags in JAXB auslassen, wenn die Auflistung leer ist

Antwort

1

Sie können Ihr gewünschtes Verhalten auf eine etwas hackische Weise erzwingen, indem Sie Marshal Event Callbacks verwenden.

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

beschrieben Wie in Marshal Event Callbacks gibt es tatsächlich zwei alternative Möglichkeiten, wie Marschall Rückrufe verwenden:

  1. Setzen Sie die beforeMarshal und/oder afterMarshal Methode direkt in die Klasse, und das ist es. (Dies ist der einfachere Weg, und deshalb habe ich das in meiner Antwort verwendet).
  2. Erstellen Sie eine Marshaller.Listener und schreiben Sie die beforeMarshal und afterMarshal Methoden dort. Sie müssten diesen Listener dann in Ihrem Marshaller registrieren.
1

Sie können Zuhörer Mechanismus der Marshaller

Sie hinzufügen können/set ein Hörer wie unten:

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

    } 
}); 

wo MyCollectionWrapper die Klasse Ihre Wrapper-Klasse repräsentiert ist.

Dies sollte das Wrapper-Tag entfernen, wenn die Sammlung leer ist.

Verwandte Themen