JAXB: comment modifier les noms de classes générés par XJC lorsque le type attr est spécifié dans XSD?

je suis un débutant de JAXB et j'ai des problèmes gênants lors de la génération de classes Java avec xjc. Je suis fourni avec 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 Item.java. C'est-à-dire que je veux les classes générées comme si XSD était comme ceci:

<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, c'est juste les gens qui construisent le XSD qui l'aiment de cette façon. Je pense qu'il y a peut être un moyen de le faire avec des liaisons personnalisées, mais je n'ai toujours pas trouvé comment.

De l'aide?

Merci, Miguel

37
demandé sur skaffman 2011-01-25 15:43:04

3 réponses

JAXB fournit deux façons d'accomplir ceci:

1. Schéma En Ligne Anntotations

vous pouvez utiliser les 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 Reliure Externe

cette personnalisation peut aussi être faite via et le fichier de reliure 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
62
répondu Blaise Doughan 2011-01-25 14:32:55

Eh bien, j'ai finalement trouvé comment le faire. Mon externe de liaison de fichier 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 xjc la commande doit être exécutée avec -extension option.

j'ai trouvé la solution dans cette page:

http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html

ce qui Concerne, Miguel

13
répondu miguel perher 2011-01-27 15:33:26

c'est le fichier de liaison externe que j'utilise pour renommer un complextype. Compile avec cxf est 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
répondu nilsmagnus 2014-04-28 06:14:40