JAXB绑定自定义
时间:2020-03-06 14:49:41 来源:igfitidea点击:
尝试从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>
并且我的自定义绑定按照此页面上的指定进行,但是它不起作用。
这是我的绑定:
<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的根元素内生成内部类的默认行为。
我看过一个人在这里和这里有相同的意图,但对我来说却无法正常工作。 :(
JAXB版本:
Specification-Version: 2.1 Implementation-Version: 2.1.8
有什么帮助吗?
解决方案
我相信这种情况正在发生,因为代表" orderProperty"序列的生成的Java类很可能本身被命名为" OrderPropertyList"。
我要做的是首先在没有任何自定义绑定的情况下生成它,然后查看它生成的类名和层次结构。然后,考虑要覆盖的内容以及如何覆盖。
我相信我们需要设置的是:
<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。我认为排除这是导致我们收到错误消息的原因。