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

任何帮助?

有帮助吗?

解决方案

我相信你需要做的是:

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

其他提示

当您拥有如下架构时,这真的很有趣:

<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 秒。所以你需要提供一个绑定,它能够触及这四个元素中的每一个复杂类型,特别是它们在模式中出现的级别(实际上只有三个,因为那时第四个就可以成为孤独的< code> Something class)。

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

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

我需要为提供的 jeff303 等架构进行自定义。我的场景略有不同,因为架构是在WSDL文档中内联的。

philvarner 指出的一点是,元素的节点选择应以'/ xs:complexType'结尾,这似乎非常重要,因为编译器会不加地生成与循环继承相关的IllegalArgumentException。

这些帖子是相关的,所以我认为链接会对某人“谷歌搜索”有所帮助,最终会在这里结束。

查看问题 7881883

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top