[英]JAXB Binding Customization
在嘗試從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
。 所以你需要提供一個綁定,它能夠觸及這四個元素和復雜類型中的每一個,特別是它們在模式中出現的級別(實際上只有三個,因為那時第四個可以成為單獨的Something
類)。
我相信這種情況正在發生,因為生成的表示“orderProperty”序列的Java類本身可能名為“OrderPropertyList”。
我要做的是首先在沒有任何自定義綁定的情況下生成它,並查看它生成的類名和層次結構。 然后,考慮要覆蓋的內容以及如何覆蓋。
在元素末尾輸入this /xs:complexType
有助於修復非法類繼承循環錯誤。
我需要為jeff303提供的架構進行自定義。 我的場景略有不同,因為架構是在WSDL文檔中內聯的。
philvarner指出的一點是, 元素的節點選擇應以'/ xs:complexType'結尾,這似乎非常重要,因為編譯器會不加地生成與循環繼承相關的IllegalArgumentException。
這些帖子是相關的,所以我認為鏈接回來會對某人“谷歌搜索”有所幫助,最終會在這里結束。
查看問題7881883
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.