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
Ответы
Ответ 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>
Кто-нибудь может увидеть очевидную ошибку?