在尝试从xsd生成类时,我遇到了这个错误:
java.lang.IllegalArgumentException: Illegal class inheritance loop. Outer class OrderPropertyList may not subclass from inner class: OrderPropertyList
我的xsd定义了一个元素来对无界元素进行分组,如下所示:
<element minOccurs="0" name="orderPropertyList">
<complexType>
<sequence>
<element maxOccurs="unbounded" name="orderProperty" type="tns:orderProperty" />
</sequence>
</complexType>
</element>
我的自定义绑定遵循this page中的指定,但它不起作用。 在这里我的约束力:
<jaxb:bindings schemaLocation="../xsd/Schema.xsd" node="/xs:schema">
<jaxb:bindings node="//xs:element[@name='orderPropertyList']">
<jaxb:class name="OrderPropertyList"/>
</jaxb:bindings>
</jaxb:bindings>
我的目的是为orderPropertyList生成一个单独的类,而不是在xsd的根元素内生成内部类的默认行为。
我已经看到有同样意图的人here和here,但它对我不起作用。 :(
JAXB版本:
Specification-Version: 2.1
Implementation-Version: 2.1.8
任何帮助?
答案 0 :(得分:13)
我相信你需要做的是:
<jaxb:globalBindings localScoping="toplevel"/>
这将生成独立类而不是嵌套类。
否则
<jaxb:bindings schemaLocation="../xsd/Schema.xsd" node="/xs:schema">
<jaxb:bindings node="//xs:element[@name='orderPropertyList']">
<jaxb:class name="OrderPropertyList"/>
</jaxb:bindings>
</jaxb:bindings>
是一个冗余绑定,因为orderPropertyList默认会映射到OrderPropertyList。包的名称包括默认嵌套的外部类名,因此您不会更改它。
另外,如果您确实想要更改生成的类的名称,我认为XPath实际上是:
<jaxb:bindings node="//xs:element[@name='orderPropertyList']/xs:complexType">
最后使用complexType。我认为排除这是导致你得到错误信息的原因。
答案 1 :(得分:2)
当您拥有如下架构时,这真的很有趣:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
<xsd:element name="TopLevelElement">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Something">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Something" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="somethingFieldA" type="xsd:string"/>
<xsd:element name="somethingFieldB" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
在这种情况下,xjc似乎试图实际生成四个名为Something
的类,一个用于名为Something
的每个元素,另一个用于complexType
个。所以你需要提供一个绑定,它能够触及这四个元素和复杂类型中的每一个,特别是它们在模式中出现的级别(实际上只有三个,因为那时第四个只能成为孤独的{ {1}}类)。
答案 2 :(得分:0)
我相信这种情况正在发生,因为代表“orderProperty”序列的生成的Java类本身可能名为“OrderPropertyList”。
我要做的是首先在没有任何自定义绑定的情况下生成它,然后查看它生成的类名和层次结构。然后,考虑要覆盖的内容以及如何覆盖。
答案 3 :(得分:0)
我需要为提供的 jeff303 等架构进行自定义。我的场景略有不同,因为架构是在WSDL文档中内联的。
philvarner 指出的一点是,元素的节点选择应以'/ xs:complexType'结尾,这似乎非常重要,因为编译器会不加地生成与循环继承相关的IllegalArgumentException。
这些帖子是相关的,所以我认为链接会对某人“谷歌搜索”有所帮助,最终会在这里结束。
查看问题7881883
答案 4 :(得分:0)
在元素末尾输入此/xs:complexType
有助于修复非法类继承循环错误。