gpt4 book ai didi

java - 如何重命名 jaxb xjc 中的嵌套类

转载 作者:行者123 更新时间:2023-11-30 03:45:20 25 4
gpt4 key购买 nike

我有一个导入模式的 wsdl我正在尝试解决 xjc 命名多个具有相同名称的嵌套 MyElementName 类的问题 - 这无法编译我在下面创建了这个绑定(bind)文件,但它给出了错误:

parsing a schema...
compiling a schema...
Exception in thread "main" java.lang.IllegalArgumentException: Illegal class inheritance loop.
Outer class MyElementName1 may not subclass from inner class: MyElementName1
at com.sun.codemodel.internal.JDefinedClass._extends(JDefinedClass.java:257)
at com.sun.tools.internal.xjc.generator.bean.ImplStructureStrategy$1._extends(ImplStructureStrategy.java:104)
at com.sun.tools.internal.xjc.generator.bean.BeanGenerator.<init>(BeanGenerator.java:197)
at com.sun.tools.internal.xjc.generator.bean.BeanGenerator.generate(BeanGenerator.java:151)
at com.sun.tools.internal.xjc.model.Model.generateCode(Model.java:275)
at com.sun.tools.internal.xjc.Driver.run(Driver.java:342)
at com.sun.tools.internal.xjc.Driver.run(Driver.java:184)
at com.sun.tools.internal.xjc.Driver._main(Driver.java:107)
at com.sun.tools.internal.xjc.Driver.access$000(Driver.java:64)
at com.sun.tools.internal.xjc.Driver$1.run(Driver.java:87)

我删除了 MyElementName1 的第一个绑定(bind),它工作正常,但只命名了类中的 1 个,我想更改这两个名称,如何更改绑定(bind)文件,以便它将两个旧嵌套类正确命名为我在下面选择的两个唯一名称。我想这样做是因为我有其他具有 4 个同名嵌套类的映射,因此需要能够命名每个类来解决更多嵌套问题区域

<jaxb:bindings 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jaxb:bindings schemaLocation="MYWSDL.wsdl">
<jaxb:bindings node="//xsd:element[@name='AAAA']//xsd:complexType//xsd:sequence/xsd:element[@name='BBB']//xsd:complexType/xsd:sequence//xsd:element[@name='MyElementName']">
<jaxb:class name="MyElementName1"/>
</jaxb:bindings>
<jaxb:bindings node="//xsd:element[@name='AAAA']//xsd:sequence/xsd:element[@name='BBB']//xsd:element[@name='MyElementName']//xsd:sequence/xsd:element[@name='CCC']//xsd:sequence/xsd:element[@name='MyElementName']/xsd:complexType">
<jaxb:class name="MyElementName2"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>

这里是 xsd(字段名称已更改,但其余部分相同)

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element minOccurs="0" name="AAA">
<xsd:complexType>
<xsd:element minOccurs="0" name="BBB">
<xsd:complexType>
<xsd:element name="MyElementName">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" name="CCC">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="MyElementName">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="FromDate" />
<xsd:element ref="ThruDate" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DDD">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="DueDate" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element minOccurs="0" ref="YYYY" />
<xsd:element minOccurs="0" ref="ZZZZ" />
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:complexType>
</xsd:element>
</xsd:complexType>
</xsd:element>
</xsd:schema>

字段 MyElementName2 没问题,如果我尝试在下面进行绑定(bind),该字段会内置到 java 文件中,它只是 jaxb 映射到多个子级的第一个字段 - 包括使用 MyElementName2 映射的字段。 XPath 总是映射到一个节点,因此可能是一个 jaxb 选项,因为它似乎正在扩展输入

这是导致以下错误的替代绑定(bind)

<jaxb:bindings 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jaxb:bindings schemaLocation="MYWSDL.wsdl">
<jaxb:bindings node="//xsd:element[@name='AAA']//xsd:sequence/xsd:element[@name='BBB']//xsd:element[@name='MyElementName']">
<jaxb:class name="MyElementName1"/>
</jaxb:bindings>
<jaxb:bindings node="//xsd:element[@name='AAA']//xsd:sequence/xsd:element[@name='BBB']//xsd:element[@name='Billing']//xsd:sequence/xsd:element[@name='CCC']//xsd:sequence/xsd:element[@name='MyElementName']/xsd:complexType">
<jaxb:class name="MyElementName2"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>

错误:

parsing a schema...
[ERROR] XPath evaluation of "//xsd:element[@name='AAA']//xsd:sequence/xsd:element[@name='BBB']//xsd:element[@name='MyElementName']" results in too many target nodes
Failed to parse a schema.

最佳答案

JAXB 为每个复杂类型生成一个类,因此我相信您应该将自定义类名绑定(bind)到 xs:complexType 而不是 xs:element。您的第一个 XPath 引用了 xs:element,我认为 JAXB 不知道如何将类绑定(bind)到它。尝试这个绑定(bind):

<jaxb:bindings 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jaxb:bindings schemaLocation="MYWSDL.wsdl">
<jaxb:bindings node="//xsd:element[@name='AAAA']//xsd:complexType//xsd:sequence/xsd:element[@name='BBB']//xsd:complexType/xsd:sequence//xsd:element[@name='MyElementName']/xs:complexType">
<jaxb:class name="MyElementName1"/>
</jaxb:bindings>
<jaxb:bindings node="//xsd:element[@name='AAAA']//xsd:sequence/xsd:element[@name='BBB']//xsd:element[@name='MyElementName']//xsd:sequence/xsd:element[@name='CCC']//xsd:sequence/xsd:element[@name='MyElementName']/xsd:complexType">
<jaxb:class name="MyElementName2"/>
</jaxb:bindings>
</jaxb:bindings>

就个人而言,与 XMLBeans 相比,我更喜欢使用 JAXB。您应该小心后者,因为在编译深度嵌套模式时,它可能会生成由于文件名长度限制(通常为 255 个字符)而无法编译的嵌套类结构。

关于java - 如何重命名 jaxb xjc 中的嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25894994/

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