wake-up-neo.com

JAXB: Wie ändere ich XJC-generierte Klassennamen, wenn attr type in XSD angegeben ist?

Ich bin ein JAXB-Anfänger und habe ärgerliche Probleme beim Generieren von Java Klassen mit xjc. Ich habe eine XSD wie diese:

<xs:element name="item" type="itemType"/>  
...   
<xs:complexType name="itemType">
    <xs:attribute name="id" type="xs:string" use="required">
    ...     
</xs:complexType>

und xjc generiert eine Klasse mit dem Namen ItemType.Java, aber ich möchte, dass der Name Item.Java lautet. Das heißt, ich möchte die generierten Klassen so, als ob das XSD so wäre:

<xs:element name="item">
    <xs:complexType>
    <xs:attribute name="id" type="xs:string" use="required">
        ...
    </xs:complexType>
</xs:element>

Es wird keine Wiederverwendung von itemType für ein anderes Element geben. Nur die Leute, die das XSD konstruieren, mögen es auf diese Weise. Ich glaube, es gibt eine Möglichkeit, dies mit benutzerdefinierten Bindungen zu tun, aber ich habe immer noch nicht herausgefunden, wie.

Irgendeine Hilfe?

Danke, Miguel

40
miguel perher

JAXB bietet dazu zwei Möglichkeiten:

1. Inline Schema Anntotations

Sie können JAXB-Schemaanmerkungen verwenden, um die Klassennamen zu steuern.

<xs:schema 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:jaxb="http://Java.Sun.com/xml/ns/jaxb"
        jaxb:version="2.1">

    <xs:complexType name="itemType">
        <xs:annotation>
            <xs:appinfo>
                <jaxb:class name="Item"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:attribute name="id" type="xs:string" use="required"/>
    </xs:complexType>

</xs:schema>

2. Externe Bindungsdatei

Diese Anpassung kann auch über eine externe Bindungsdatei erfolgen:

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://Java.Sun.com/xml/ns/jaxb"
    version="2.1">

    <jxb:bindings schemaLocation="your-schema.xsd">
            <jxb:bindings node="//xs:complexType[@name='itemType']">
                <jxb:class name="Item"/>
            </jxb:bindings>
    </jxb:bindings>

</jxb:bindings>

Die xjc-Befehlszeile wäre:

xjc -d out -b binding.xml your-schema.xsd
65
bdoughan

Nun, ich habe endlich herausgefunden, wie es geht. Meine externe Bindungsdatei lautet:

<?xml version="1.0"?>
<jxb:bindings version="1.0"
              xmlns:jxb="http://Java.Sun.com/xml/ns/jaxb"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xmlns:xjc="http://Java.Sun.com/xml/ns/jaxb/xjc"
              jxb:extensionBindingPrefixes="xjc">

  <jxb:globalBindings>              
    <xjc:simple/>
  </jxb:globalBindings>

</jxb:bindings>

der Befehl xjc muss mit der Option -extension ausgeführt werden.

Ich habe die Lösung auf dieser Seite gefunden:

http://weblogs.Java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html [~ # ~] edit [~ # ~ ] : veralteter Link)

https://community.Oracle.com/blogs/kohsuke/2006/03/03/why-does-jaxb-put-xmlrootelement-sometimes-not-always (neuer Link)

Grüße, Miguel

16
miguel perher

Dies ist die externe Bindungsdatei, mit der ich einen komplexen Typ umbenenne. Kompiliert mit cxfs wsdl2Java.

<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings xmlns:jaxws="http://Java.Sun.com/xml/ns/jaxws" xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:jxb="http://Java.Sun.com/xml/ns/jaxb" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[1]">
        <jxb:bindings node="//xs:complexType[@name='VatNumber_exception']">
             <jxb:class name="VatNumException"/>
        </jxb:bindings>

    </jaxws:bindings>
</jaxws:bindings>
1
nilsmagnus