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