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>

私の意図は、xsd のルート要素内に内部クラスを生成するデフォルトの動作ではなく、orderPropertyList の個別のクラスを生成することです。

ここここで同じ意図を持つ人を見てきましたが、うまくいきません。:(

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 は実際には という 4 つのクラスを生成しようとしているように見えますSomething。1 つは という名前の要素ごとSomethingに 1 つ、それぞれの には 1 つですcomplexTypeしたがって、これらの 4 つの要素と複雑な型のそれぞれを、特にスキーマ内で発生するレベルでヒットするバインディングを提供する必要があります (実際には 3 つだけです。4 番目の要素が唯一のSomethingクラスになる可能性があるためです)。

于 2011-10-15T01:09:52.870 に答える
0

要素の最後にこれを入力/xs:complexTypeすると、不正なクラス継承ループ エラーの修正に役立ちました。

于 2015-11-23T09:33:07.753 に答える
0

jeff303が提示したようなスキーマのカスタマイズを行う必要がありました。私のシナリオは、スキーマが WSDL ドキュメント内でインライン化されているという点で少し異なります。

philvarnerが指摘したことの 1 つは、要素のノード選択は「/xs:complexType」で終了する必要があるということです。これは、コンパイラーがそれなしでループ継承に関連する IllegalArgumentException を継続的に生成するため、非常に重要であると思われました。

これらの投稿は関連しているので、ここにたどり着く「グーグル」の誰かにリンクが役立つと思いました.

質問7881883を確認してください

于 2011-10-25T14:31:37.533 に答える
0

「orderProperty」のシーケンスを表す生成された Java クラス自体が「OrderPropertyList」という名前である可能性が高いため、これが発生していると思います。

私がすることは、最初にカスタム バインディングなしで生成し、それが生成するクラス名と階層を確認することです。次に、何をどのようにオーバーライドするかを検討します。

于 2008-09-27T18:04:09.413 に答える