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。我认为排除这是导致我们收到错误消息的原因。