gpt4 book ai didi

java - JAXB 重复类重命名

转载 作者:行者123 更新时间:2023-11-30 07:18:49 27 4
gpt4 key购买 nike

嗨,我想知道是否有人可以帮助我。我有两个 .xsd 架构文件 orderservice-order.xsd 和 order.xsd,每个文件都命名一个元素类型“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 绑定(bind) .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”

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

有人以前见过这个并知道解决方法吗???顺便说一句,我不控制架构文件的内容。

谢谢

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

maven 配置

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

最佳答案

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

这是一个例子:

<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

编辑

我成功地在我这边重现了这个问题。问题是目标 namespace :

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

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

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

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

我不再有这个问题了。

关于java - JAXB 重复类重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37947137/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com