簡體   English   中英

JAXB綁定自定義

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM