Подтвердить что ты не робот

JAXB: Как изменить имена классов, сгенерированных XJC, когда тип attr указан в XSD?

Я начинаю JAXB, и у меня возникают неприятные проблемы при создании классов Java с помощью xjc. Я снабжен XSD следующим образом:

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

и xjc генерирует класс с именем ItemType.java, но я хочу, чтобы имя было Item.java. То есть, я хочу, чтобы сгенерированные классы, как будто XSD был примерно таким:

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

Не будет никакого повторного использования itemType для любого другого элемента, ему просто нравится тот, кто строит XSD. Я предполагаю, что может быть способ сделать это с помощью настраиваемых привязок, но я до сих пор не нашел, как это сделать.

Любая помощь?

Спасибо, Miguel

4b9b3361

Ответ 1

JAXB предоставляет два способа выполнить это:

1. Инлайн-аннотации

Вы можете использовать аннотации схем JAXB для управления именами классов.

<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. Внешний файл привязки

Эта настройка также может быть выполнена через внешний файл привязки:

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

Командная строка xjc:

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

Ответ 2

Ну, наконец я нашел, как это сделать. Мой внешний файл привязки:

<?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>
Команда

и xjc должна выполняться с опцией -extension.

Я нашел решение на этой странице:

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

С уважением, Miguel

Ответ 3

Это внешний файл привязки, который я использую для переименования complextype. Компилирует cxf 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>

Ответ 4

В первый раз пробую это с jaxb, и это не похоже на работу для меня

<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="trayport-api-schema.xsd" node="/xs:schema">
    <jxb:bindings node="//xs:simpleType[@name='JttSessionType']">
        <jxb:class name="JttSessionTypeSimpleSimple"/>
    </jxb:bindings>
</jxb:bindings>


<jxb:bindings schemaLocation="trayport-api-schema.xsd" node="/xs:schema">
    <jxb:bindings node="//xs:complexType[@name='JTTSESSIONType']">
        <jxb:class name="JttSessionTypeSimpleComplex"/>
    </jxb:bindings>
</jxb:bindings>

не знаю почему, но это не меняет имя класса

здесь мой Maven экстракт

<plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!-- The name of your generated source package -->
                <arguments>-extension -npa -b ${project.basedir}/src/main/xsd/global.xjb </arguments>
            </configuration>
        </plugin>

Кто-нибудь может увидеть очевидную ошибку?