Come generare annotazioni XMLElementWrapper con xjc e binding personalizzato

Sto usando JAXB e xjc per compilare il mio schema XML in classi Java. Non voglio modificare manualmente queste classi generate. Ho uno schema xml del genere:

             

Xjc genera una class Items che contiene solo un elenco di oggetti Item . C’è qualche possibilità di omettere gli Items della class e di avere una lista di oggetti Item direttamente nella class Root ?

So che questo può essere fatto con @XMLElementWrapper annotazione @XMLElementWrapper , ma non so come dire a xjc di crearlo.

Grazie per eventuali suggerimenti!

Cordiali saluti, Markus

Bjarne Hansen ha sviluppato un plugin per xjc che è stato in grado di occuparsi di questo. Sfortunatamente, il collegamento all’implementazione originale ora è morto. Tuttavia, c’è un progetto di Dmitry Katsubo su github, basato sul codice originale di Bjarne con alcuni miglioramenti aggiuntivi.

https://github.com/dmak/jaxb-xew-plugin


(Solo per riferimento: il link originale, ora morto: http://www.conspicio.dk/blog/bjarne/jaxb-xmlelementwrapper-plugin )

Innanzitutto consente di suddividere lo schema in modo che non siano generate classi interne:

               

Riceverai comunque lezioni extra, ma non tutte in un unico file. Ora vuoi aggiungere una sezione alla tua build per usare il jaxb-xew-plugin . Io uso Maven, quindi per me questo sembra:

  org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.8.2    generate    -no-header -Xxew -Xxew:instantiate lazy -Xxew:delete    com.github.jaxb-xew-plugin jaxb-xew-plugin 1.0       

Se inizi a utilizzare gli spazi dei nomi in modo che le tue classi generate abbiano nomi di pacchetti, lascia fuori l’ -Xxew:delete , in quanto c’è un bug che ho risolto di recente quando stavo eliminando oggetti che non avrebbe dovuto. In alternativa, puoi prendere il codice da github e usarlo come 1.1-SNAPSHOT.

Quando lo faccio ottengo il codice generato che penso tu stia cercando:

 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Root", propOrder = { "items" }) public class Root { @XmlElementWrapper(name = "items", required = true) @XmlElement(name = "item") protected List items; public List getItems() { if (items == null) { items = new ArrayList(); } return items; } public void setItems(List items) { this.items = items; } }