gpt4 book ai didi

java - Chameleon XSD 导入的 JAXB 解决方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:52:22 25 4
gpt4 key购买 nike

这是我的第一个问题,所以请保持温和;)

我遇到了一个奇怪的问题。基本上我得到了如下三个 XSD 定义:

PartA.xsd
targetNameSpace="PartA"
include="PartB.xsd"

PartB.xsd
<!-- no namespace definition!!! -->

PartC.xsd
targetNameSpace="PartC"
inlude="PartB.xsd"
import="PartA.xsd"

当通过 JAXB 将 PartC 绑定(bind)到 Java 类时,弹出错误:

  • 同名“b.exampleType”的类/接口(interface)已被使用。使用类自定义来解决此冲突。
  • 发生这种令人困惑的错误很可能是因为该模式使用了一种称为“变色龙模式”的技术,这会导致将单个定义多次加载到不同的 namespace 中。参见 http://forums.java.net/jive/thread.jspa?threadID=18631有关此的更多信息。

按照链接,我发现,真正的错误在于PartB,它没有命名空间声明!此方法称为 Chameleon SchemaPartB 中定义的类型将采用导入 XSD 的命名空间。

所以在我的例子中,同一类型有两个命名空间:

  1. “A 部分”
  2. “C 部分”

这就是 JAXB 崩溃的地方。我还没有找到正确绑定(bind) PartC 的方法。并且(让事情变得棘手)我有机会更改原始的 XSD 定义!

有没有人以前遇到过这种现象或类似情况并且有有效的解决方法?

最佳答案

我在使用 wsdl2java 时遇到了同样的问题:

WSDLToJava Error: Thrown by JAXB : A class/interface with the same name "Respuesta" is already in use. Use a class customization to resolve this conflict.

但是这个question给我指明了正确的方向。使用 CFX 中的 wsdl2java,您可以自定义如何使用 binding.xml 文件将元素绑定(bind)到类。例如:

/Applications/apache-cxf-2.7.13/bin/wsdl2java -b ./src/main/resources/binding.xml -V -d src/main/java -compile -classdir target/classes  http://someurl.wsdl

关键是在binding.xml中说明,用一个特定的className来命名某个xsd元素,以避免冲突:

<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="./someXsdFile.xsd">
<!-- Rename the respuesta class to resolve a naming conflict with other Respuesta element already defined-->
<jxb:bindings node="//xs:element[@name='respuesta']/xs:complexType">
<jxb:class name="Respuesta2" />
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>

希望这对下一个使用 wsdl2java 遇到此问题的人有所帮助。我想其他工具应该允许类似的方法来解决这个问题。

关于java - Chameleon XSD 导入的 JAXB 解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3975945/

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