Je suis un débutant à JAXB et j'ai des problèmes ennuyeux lors de la génération de classes Java avec xjc. On me fournit un XSD comme ceci:
<xs:element name="item" type="itemType"/>
...
<xs:complexType name="itemType">
<xs:attribute name="id" type="xs:string" use="required">
...
</xs:complexType>
et xjc génère une classe appelée ItemType.Java
, mais je veux que le nom soit Item.Java
. Autrement dit, je veux que les classes générées comme si le XSD était comme ça:
<xs:element name="item">
<xs:complexType>
<xs:attribute name="id" type="xs:string" use="required">
...
</xs:complexType>
</xs:element>
Il n'y aura pas de réutilisation de itemType sur aucun autre élément, ce sont juste les gens qui construisent le XSD comme ça. Je suppose qu'il peut y avoir un moyen de le faire avec des liaisons personnalisées mais je n'ai toujours pas trouvé comment.
De l'aide?
Merci, Miguel
JAXB propose deux méthodes pour y parvenir:
1. Annotations de schéma en ligne
Vous pouvez utiliser des annotations de schéma JAXB pour contrôler les noms de classe.
<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. Fichier de liaison externe
Cette personnalisation peut également être effectuée via un fichier de liaison externe:
<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>
La ligne de commande xjc serait:
xjc -d out -b binding.xml your-schema.xsd
Eh bien, j'ai finalement trouvé comment le faire. Mon fichier de liaison externe est:
<?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>
et la commande xjc
doit être exécutée avec -extension
option.
J'ai trouvé la solution sur cette page:
http://weblogs.Java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html ( [~ # ~] modifier [~ # ~ ] : lien obsolète)
https://community.Oracle.com/blogs/kohsuke/2006/03/03/why-does-jaxb-put-xmlrootelement-sometimes-not-always (nouveau lien)
Cordialement, Miguel
Il s'agit du fichier de liaison externe que j'utilise pour renommer un type complexe. Compile avec wsdl2Java de cxf.
<?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>