4

尝试从 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

有什么帮助吗?

4

5 回答 5

14

我相信您需要设置:

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

于 2008-10-07T19:15:49.677 回答
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,一个用于它们的每个complexTypes。因此,您需要提供一个绑定,该绑定专门针对这四个元素复杂类型中的每一个,特别是在它们出现在模式中的级别(实际上只有三个,因为那样第四个就可以成为唯一的Something类)。

于 2011-10-15T01:09:52.870 回答
0

我相信这种情况正在发生,因为生成的表示“orderProperty”序列的 Java 类本身很可能被命名为“OrderPropertyList”。

我要做的是首先在没有任何自定义绑定的情况下生成它,然后查看它生成的类名和层次结构。然后,考虑你想要覆盖什么,以及如何覆盖。

于 2008-09-27T18:04:09.413 回答
0

我需要对类似jeff303提供的模式进行自定义。我的场景稍有不同,因为模式是内联在 WSDL 文档中的。

philvarner指出的一件事是元素的节点选择应该以 '/xs:complexType' 结尾,这似乎非常重要,因为如果没有它,编译器将不断生成与循环继承相关的 IllegalArgumentException。

这些帖子是相关的,所以我认为返回链接将对最终出现在这里的“谷歌搜索”有所帮助。

查看问题7881883

于 2011-10-25T14:31:37.533 回答
0

/xs:complexType在元素末尾输入 this有助于修复非法类继承循环错误。

于 2015-11-23T09:33:07.753 回答