generar clases java a partir de xsd eclipse
¿Cómo generar clases de @XmlRootElement para tipos base en XSD? (2)
Esta question referencia a una blog de Kohsuke Kawaguchi, que anteriormente trabajó en JAX-B o JAX-WS RI, que habla sobre el proceso de toma de decisiones de RI y la falta de claridad sobre este tema en la especificación.
La publicación del blog menciona que la función de enlace simple es parte de RI. ¿Está utilizando el RI para generar su código?
Estoy teniendo algunos problemas con la generación de clases Java con las anotaciones JAXB apropiadas desde un XSD utilizando XJC.
Tengo un archivo XSD relativamente simple que define mi esquema XML. Los tipos complejos dentro del XSD aprovechan la herencia usando las etiquetas <xs:extension>
. El problema que tengo es que necesito todos los tipos complejos para generar clases Java con @XmlRootElement
.
Desafortunadamente, la forma en que XJC genera las clases significa que solo la clase derivada obtiene el @XmlRootElement
(no la clase base). Estoy utilizando la simple directiva de enlace global para garantizar que resuelva muchos de los otros problemas que he enfrentado con XJC.
Aquí hay un fragmento de ejemplo del XSD:
<xs:schema version="1.0" targetNamespace="http://www.knowledgemill.com/kmcs"
xmlns:kmcs="http://www.knowledgemill.com/kmcs"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc"
elementFormDefault="qualified">
<xs:annotation>
<xs:appinfo>
<jaxb:globalBindings>
<xjc:simple />
</jaxb:globalBindings>
</xs:appinfo>
</xs:annotation>
<xs:element name="Artifact" type="kmcs:Artifact"/>
<xs:element name="EmailArtifact" type="kmcs:EmailArtifact"/>
<xs:complexType name="Artifact">
<xs:sequence>
<xs:element name="artifactId" type="xs:string" minOccurs="0"/>
<xs:element name="artifactType" type="xs:string" minOccurs="0"/>
<xs:element name="contentHash" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="EmailArtifact">
<xs:complexContent>
<xs:extension base="kmcs:Artifact">
<xs:sequence>
<xs:element name="subject" type="xs:string" minOccurs="0"/>
<xs:element name="threadSubject" type="xs:string" minOccurs="0"/>
<xs:element name="from" type="xs:string" minOccurs="0"/>
<xs:element name="to" type="xs:string" minOccurs="0"/>
<xs:element name="cc" type="xs:string" minOccurs="0"/>
<xs:element name="bcc" type="xs:string" minOccurs="0"/>
<xs:element name="messageId" type="xs:string" minOccurs="0"/>
<xs:element name="date" type="xs:date" minOccurs="0"/>
<xs:element name="size" type="xs:long" minOccurs="0"/>
<xs:element name="hasAttachment" type="xs:boolean" minOccurs="0"/>
<xs:element name="sensitivity" type="xs:string" minOccurs="0"/>
<xs:element name="headerHash" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Como podemos ver en el fragmento anterior, EmailArtifact
extiende Artifact
.
El código de clase java para EmailArtifact
contiene lo siguiente:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "EmailArtifact", propOrder = {
"subject",
"threadSubject",
"from",
"to",
"cc",
"bcc",
"messageId",
"date",
"size",
"hasAttachment",
"sensitivity",
"headerHash"
})
@XmlSeeAlso({
ExtendedEmail.class
})
@XmlRootElement(name = "EmailArtifact")
public class EmailArtifact
extends Artifact
{
protected String subject;
protected String threadSubject;
protected String from;
protected String to;
protected String cc;
protected String bcc;
protected String messageId;
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar date;
protected Long size;
protected Boolean hasAttachment;
protected String sensitivity;
protected String headerHash;
El código de clase java para Artifact
contiene lo siguiente:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Artifact", propOrder = {
"artifactId",
"artifactType",
"contentHash"
})
@XmlSeeAlso({
ManagedDocArtifact.class,
EmailArtifact.class
})
public class Artifact {
protected String artifactId;
protected String artifactType;
protected String contentHash;
En EmailArtifact
podemos ver que contiene @XmlRootElement
pero el tipo base Artifact
no contiene @XmlRootElement
.
¿Cómo puede obligar a XJC a generar @XmlRootElement
para todas las clases, incluidos los tipos básicos?
Solo enlace usando xjb-file:
<?xml version="1.0"?>
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings schemaLocation="path/to/myschema.xsd" node="/xs:schema">
<jxb:globalBindings>
<xjc:simple />
</jxb:globalBindings>
</jxb:bindings>
</jxb:bindings>
Y no te olvides de definir el elemento del mismo tipo:
<xs:complexType name="Artifact" />
<xs:element name="artifact" type="Artifact">