JAXB重复类重命名

时间:2016-06-21 14:25:58

标签: java maven xsd jaxb

嗨,我想知道是否有人可以帮助我。我有两个.xsd架构文件orderservice-order.xsd和order.xsd,每个都命名一个元素类型为“order”。

order.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
       targetNamespace="http://xml.xxxxxxxx.com/order"  
<xs:element name="order">
   <xs:complexType>
       <xs:sequence>
           <xs:element name="client" type="xs:string" minOccurs="0" maxOccurs="1" />
                   more elements here
      </xs:sequence>
   </xs:complexType>
</xs:element>

</xs:schema>

orderservice-order.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
       targetNamespace="http://xml.xxxxxxxx.com/order"  

<xs:element name="order">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="orderNumber" type="xs:string" minOccurs="1" maxOccurs="1" />
                more elements here
        </xs:sequence>
    </xs:complexType>
</xs:element>

jaxbBindings.xjb

<jxb:bindings schemaLocation="../XSD/v1.0/Representation/orderservice-order.xsd">
    <jxb:bindings node="//xs:element[@name='order']/xs:complexType">
        <jxb:class name="OSOrder" />
    </jxb:bindings>
</jxb:bindings>

当我为这些模式文件创建Java源代码时,我显然在Order类上遇到类名冲突。

我创建了一个jaxb绑定.xjb文件,用于从orderservice-order.xsd重命名生成的Order类名。

但是我仍然收到以下错误

...XSD/v1.0/Representation/orderservice-order.xsd; lineNumber: 69;  columnNumber: 15; 'order' is already defined

.xjb文件中的XPATH似乎没有问题。如果我将orderservice-order.xsd中的元素重命名为orderNew并将xpath更改为

node="//xs:element[@name='orderNew']/xs:complexType" 

显然没有名称冲突,但是类重命名为'OSOrder'

就好像在绑定文件重命名之前对模式文件进行了一些预验证。我尝试关闭各种jaxb / maven设置,例如严格验证等,但无济于事。

之前有人看过这个,知道修复它的方法吗?顺便说一句,我不控制架构文件的内容。

谢谢

我正在使用在Java 7上运行的maven插件jaxb2-maven-plugin 1.3版和jaxb 2.0版。

maven config

    <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.3</version>
            <executions>
                <execution>
                    <id>Representations</id>
                    <configuration>
                        <schemaDirectory>XSD/v1.0/Representation</schemaDirectory>
                        <packageName>com.xxxxxxxxx.xml.representation.v1</packageName>
                        <bindingDirectory>XSD/v1.0/Representation</bindingDirectory>
                        <outputDirectory>src/main/generated-sources</outputDirectory>
                        <staleFile>${project.build.directory}/generated-sources/jaxb/.representation</staleFile>
                        <clearOutputDir>false</clearOutputDir>
                    </configuration>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                </execution> 

1 个答案:

答案 0 :(得分:1)

在JAXB绑定中,您可以根据需要为每个文件指定绑定,并为每个文件重命名该类,以便解决冲突。

以下是一个例子:

<jxb:bindings schemaLocation="order.xsd">
    <jxb:bindings node="//xs:element[@name='order']">
        <jxb:class name="Order" implClass="Order"/>
    </jxb:bindings> 
</jxb:bindings>

<jxb:bindings schemaLocation="orderservice-order.xsd">
    <jxb:bindings node="//xs:element[@name='order']">
        <jxb:class name="OSOrder" implClass="OSOrder"/>
    </jxb:bindings>
</jxb:bindings>

以下是文档:http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html

修改

我设法重现了我身边的问题。 问题是目标命名空间:

targetNamespace="http://xml.xxxxxxxx.com/order"

在两个XSD中都有相同的目标名称空间。 因此,您在同一名称空间中两次定义类型order,这是不可能的。 如果更改目标命名空间,则不会再出现问题。

orderservice-order.xsd的示例,我将目标名称空间更改为:

targetNamespace="http://xml.xxxxxxxx.com/orderservice-order"

我不再有问题了。