Mam pewne problemy z generowaniem klas Java z odpowiednimi adnotacjami JAXB z XSD przy użyciu XJC.Jak wygenerować klasy @XmlRootElement dla typów podstawowych w XSD?
Mam stosunkowo prosty plik XSD definiujący mój schemat XML. Złożone typy w XSD korzystają z dziedziczenia przy użyciu znaczników <xs:extension>
. Problemem, który mam, jest to, że potrzebuję wszystkich złożonych typów do generowania klas Java z @XmlRootElement
.
Niestety sposób, w jaki XJC generuje klasy, oznacza, że tylko klasa pochodna otrzymuje @XmlRootElement
(nie jest to klasa podstawowa). Używam prostej globalnej dyrektywy wiążącej, aby upewnić się, że rozwiązuje ona wiele innych problemów, z jakimi miałem do czynienia w XJC.
Oto przykład fragment 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>
Jak widać z powyższego fragmentu, EmailArtifact
rozciąga Artifact
.
Kod klasy java dla EmailArtifact
zawiera następujące elementy:
@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;
Kod klasy java dla Artifact
zawiera następujące elementy:
@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;
W EmailArtifact
widzimy, że zawiera on @XmlRootElement
ale typ podstawowy Artifact
nie zawiera @XmlRootElement
.
Jak zmusić XJC do wygenerowania @XmlRootElement
dla wszystkich klas, w tym typów bazowych.
Prosty tryb wiązania powinien zrobić. Czy na pewno określasz go poprawnie? – skaffman
Tak, jestem pewny, że jestem - tutaj jest szczyt mojego XSD z odpowiednimi globalBindings ... Xml version = "1.0" encoding = "UTF-8"?> JAXB: globalBindings> xs: adnotacja> –
jallch
Tak, to powinno zadziałać, jak sądzę, mimo że zawsze używałem zewnętrznych dostosowań bindowania, a raczej wstawianych – skaffman