Comment générer des Classes @XmlRootElement pour les types de Base dans XSD?

j'ai quelques problèmes avec la génération de Classes Java avec les annotations JAXB appropriées à partir d'un XSD utilisant XJC.

j'ai un fichier XSD relativement simple définissant mon schéma XML. Les types complexes au sein de XSD tirent avantage de l'héritage en utilisant les étiquettes <xs:extension> . Le problème que j'ai est que j'ai besoin de tous les types complexes pour générer des Classes Java avec le @XmlRootElement .

malheureusement, la façon dont XJC génère les classes signifie que seule la classe dérivée obtient le @XmlRootElement (pas la classe de base). J'utilise la simple directive contraignante mondiale pour m'assurer qu'elle résout bon nombre des autres problèmes que J'ai rencontrés avec XJC.

voici un exemple d'extrait de 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>

comme nous pouvons le voir de l'extrait ci-dessus, EmailArtifact s'étend Artifact .

le code de classe java pour EmailArtifact contient ce qui suit:

@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;

le code de classe java pour Artifact contient ce qui suit:

@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;

Dans le EmailArtifact nous pouvons voir qu'il contient le @XmlRootElement mais le type de base Artifact ne contient pas @XmlRootElement .

comment forcer XJC à générer @XmlRootElement pour toutes les classes, y compris les types de base.

24
demandé sur k0ner 2009-10-03 19:50:17

2 réponses

liez juste en utilisant 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>

et n'oubliez pas de définir un élément du même type:

<xs:complexType name="Artifact" />
<xs:element name="artifact" type="Artifact">
28
répondu Azee 2012-10-12 10:45:57

Ce question fait référence à un blog post par kohsuke nous Kawaguchi, anciennement travaillé sur le JAX-B ou JAX-WS RI, qui parle de la RI du processus de prise de décision et le manque de clarté sur cette question dans la spec.

le billet de blog mentionne que la caractéristique de reliure simple fait partie de la RI. Utilisez-vous le RI pour générer votre code?

3
répondu DavidValeri 2017-05-23 12:03:07