net java jaxb xjc

java - net - Cómo generar una anotación XMLElementWrapper con xjc y un enlace personalizado



xjc wsdl (2)

Bjarne Hansen desarrolló un plugin para xjc que pudo encargarse de esto. Desafortunadamente, el enlace a la implementación original ahora está muerto. Sin embargo, hay un proyecto de Dmitry Katsubo en github, basado en el código original de Bjarne con algunas mejoras adicionales.

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

(Solo para referencia: el enlace original, ahora muerto: http://www.conspicio.dk/blog/bjarne/jaxb-xmlelementwrapper-plugin )

Estoy usando JAXB y xjc para compilar mi esquema XML en clases de Java. No quiero editar manualmente estas clases generadas. Tengo un esquema XML como ese:

<xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="items"> <xs:complexType> <xs:sequence> <xs:element ref="item" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element>

El xjc genera una clase de Items que solo contiene una lista de objetos del Item . ¿Hay alguna posibilidad de omitir los Items la clase y tener una lista de objetos del Item directamente en la clase Root ?

Sé que esto se puede hacer con la anotación @XMLElementWrapper , pero no sé cómo decirle a xjc que cree tal cosa.

Gracias por cualquier sugerencia!

Saludos cordiales, Markus


Primero, rompamos el esquema para que no se generen clases internas:

<?xml version="1.0" encoding="ISO-8859-1"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root" type="Root" /> <xs:complexType name="Root"> <xs:sequence> <xs:element name="items" type="Items" /> </xs:sequence> </xs:complexType> <xs:complexType name="Items"> <xs:sequence> <xs:element name="item" type="xs:string" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> </xs:schema>

Aún recibirás clases extra, pero no todas en un solo archivo. Ahora desea agregar una sección a su compilación para usar el https://github.com/dmak/jaxb-xew-plugin . Yo uso Maven, así que para mí esto se ve así:

<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.8.2</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <args> <arg>-no-header</arg> <arg>-Xxew</arg> <arg>-Xxew:instantiate lazy</arg> <arg>-Xxew:delete</arg> </args> <plugins> <plugin> <groupId>com.github.jaxb-xew-plugin</groupId> <artifactId>jaxb-xew-plugin</artifactId> <version>1.0</version> </plugin> </plugins> </configuration> </execution> </executions> </plugin>

Si empiezas a usar espacios de nombres para que tus clases generadas tengan nombres de paquetes, deja de lado el -Xxew:delete , ya que hay un error que solucioné recientemente cuando estaba eliminando objetos que no debería. Alternativamente, puedes tomar el código de github y usarlo como 1.1-SNAPSHOT.

Cuando hago eso obtengo el código generado que creo que estás buscando:

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