2009-10-03 12 views
24

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.

+0

Prosty tryb wiązania powinien zrobić. Czy na pewno określasz go poprawnie? – skaffman

+0

Tak, jestem pewny, że jestem - tutaj jest szczyt mojego XSD z odpowiednimi globalBindings ... jallch

+0

Tak, to powinno zadziałać, jak sądzę, mimo że zawsze używałem zewnętrznych dostosowań bindowania, a raczej wstawianych – skaffman

Odpowiedz

3

This question odwołuje się blog post przez Kohsuke Kawaguchi, dawniej pracowali na JAX-B lub JAX-WS RI, że rozmowy o proces i brak przejrzystości podejmowania decyzji RI w tej sprawie w spec.

Wpis na blogu wspomina, że ​​prosta funkcja wiązania jest częścią RI. Czy używasz RI do generowania kodu?

28

Wystarczy powiązać z użyciem xjb plik:

<?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> 

I nie zapomnij, aby zdefiniować element tego samego typu:

<xs:complexType name="Artifact" /> 
<xs:element name="artifact" type="Artifact"> 
+2

Dzięki! To najlepsze rozwiązanie. Nie trzeba zmieniać schematu XSD i nie trzeba zmieniać generowanej klasy głównej. –

+0

Czy mógłbyś wyjaśnić drugą część dotyczącą konieczności zdefiniowania i elementu tego samego typu? Gdzie to jest zdefiniowane? Miałem nadzieję, że nie zmienię XSD lub wygenerowanych klas. – iX3

+2

To również zadziałało. Obie właściwości w jxb: bindings nie są konieczne. Dodatkowo musiałem dostarczyć kompilator xjc z parametrem extension = true w linii poleceń (w ramach Ant-Script). – Heri