質問
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
という4つのクラスを実際に生成しようとしているようです。1つは Something
という名前の各要素に、もう1つは complexType
s。そのため、これらの4つの要素およびのそれぞれをスキーマ内で発生するレベルで具体的にヒットするバインディングを提供する必要があります(実際には3つだけです。 code> Something クラス)。
&quot; orderProperty&quot;のシーケンスを表す生成されたJavaクラスである可能性が高いため、これが起こっていると思います。それ自体は&quot; OrderPropertyList&quot;という名前です。
最初にカスタムバインディングなしで生成し、生成されるクラス名と階層を確認します。次に、オーバーライドする対象とその方法を検討します。
提示された jeff303 のようなスキーマのカスタマイズを行う必要がありました。私のシナリオは、スキーマがWSDLドキュメント内にインライン化されているという点でわずかに異なっていました。
philvarner が指摘することの1つは、要素のノード選択が '/ xs:complexType' で終わる必要があることです。これは、コンパイラがするように非常に重要であると思われます継承のループに関連するIllegalArgumentExceptionを継続的に生成します。
これらの投稿は関連しているので、ここにたどり着く「グーグル」に役立つリンクが役立つと思いました。
質問 7881883
をご覧ください>要素の最後にこの / xs:complexType
を入力すると、不正なクラス継承ループエラーの修正に役立ちました。