簡體   English   中英

XSD中的嵌套元素會導致JAXB中出現非法類繼承循環異常,如何才能正確覆蓋綁定?

[英]Nested elements in XSD cause Illegal class inheritance loop exception in JAXB, how can I properly override the bindings?

我有一個問題,我正在嘗試綁定一個名為' Contains '三次的XML。

所以我讀到可以使用綁定文件覆蓋節點名稱。 目前它不起作用。

我認為錯誤來自綁定文件中的Xpath,但我不確定。 我已經嘗試了很多方法,但我從未成功過。

有我的XSD文件:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="fr:gouv:ae:archive:draft:standard_echange_v0.2" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1">

  <xs:element name="ArchiveTransferRequest">
    <xs:complexType>
      <xs:sequence>

        <xs:element type="xs:string" name="Comment"/>
        <xs:element type="xs:dateTime" name="Date"/>
        <xs:element name="TransferRequestIdentifier">....</xs:element>
        <xs:element name="TransferringAgency">...</xs:element>
        <xs:element name="ArchivalAgency">...</xs:element>

        <xs:element name="Contains">
          <xs:complexType>
            <xs:sequence>

              <xs:element type="xs:string" name="ArchivalAgencyArchiveIdentifier"/>
              <xs:element type="xs:string" name="ArchivalAgreement"/>
              <xs:element type="xs:string" name="ArchivalProfile"/>
              <xs:element name="DescriptionLanguage">...</xs:element>
              <xs:element name="DescriptionLevel">...</xs:element>
              <xs:element type="xs:string" name="Name"/>
              <xs:element name="ContentDescription">...</xs:element>

              <xs:element name="Contains" id="contains" >
                <xs:complexType>
                  <xs:sequence>

                    <xs:element name="DescriptionLevel">...</xs:element>
                    <xs:element type="xs:string" name="Name"/>
                    <xs:element name="ContentDescription">...<xs:element>

                    <xs:element name="Contains" maxOccurs="unbounded" minOccurs="0">
                      <xs:annotation>
                        <xs:documentation>a new contains for a new  XML</xs:documentation>
                      </xs:annotation>
                      <xs:complexType>
                        <xs:sequence>
                             ...
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

並修改第二個和第三個'Contains'節點的綁定文件。

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               version="2.1">
    <jaxb:bindings schemaLocation="seda_actes.xsd">
        <jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest']/xs:complexType/xs:sequence/xs:element[@name='Contains']/xs:complexType/xs:sequence/xs:element[@name='Contains']">
            <jaxb:class name="SecondContains"/>
        </jaxb:bindings>
         <jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest']/xs:complexType/xs:sequence/xs:element[@name='Contains']/xs:complexType/xs:sequence/xs:element[@name='Contains']/xs:complexType/xs:sequence/xs:element[@name='Contains']">
            <jaxb:class name="ThirdContains"/>
        </jaxb:bindings>
    </jaxb:bindings>

</jaxb:bindings>

但是當我執行以下xjc命令時:

xjc -b C:\\ Users \\ jtvervliet \\ Documents \\ SAE \\ seda_actes_binding.xml -d C:\\ Users \\ jtvervliet \\ workspace \\ poc_bordereau \\ src -p test4.impnat.xml C:\\ Users \\ jtvervliet \\ Documents \\ SAE \\ seda_actes的.xsd

我有這個錯誤:

分析dunchéma...編譯dunshéma...線程中的異常“main”java.lang.IllegalArgumentException:非法的類繼承循環。 外類SecondContains可能不是內部類的子類:com.sun.codemodel.internal.JDefinedClass._extends(JDefinedClass.java:258)中的SecondContains,位於com.sun.tools.internal.xjc.generator.bean.ImplStructureStrategy $ 1._extends( ImplStructureStrategy.java:104)com.sun.tools.internal.xjc.generator.bean.BeanGenerator。(BeanGenerator.java:200)at com.sun.tools.internal.xjc.generator.bean.BeanGenerator.generate(BeanGenerator) .java:154)at com.sun.tools.internal.xjc.model.Model.generateCode(Model.java:275)at com.sun.tools.internal.xjc.Driver.run(Driver.java:348)at com.sun.tools.internal.xjc.Driver.run(Driver.java:185)位於com.sun.tools.internal.xjc.Driver._main(Driver.java:108)的com.sun.tools.internal。 xjc.Driver.access $ 000(Driver.java:65)at com.sun.tools.internal.xjc.Driver $ 1.run(Driver.java:88)

任何想法將不勝感激:)

謝謝。

你寫了:

 <jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest'] /xs:complexType/xs:sequence/xs:element[@name='Contains'] /xs:complexType/xs:sequence/xs:element[@name='Contains']"> 

我拿了你的XSD並修好了它,使它成為一份法律文件。 然后我拿了你的XPath表達式,他們正確選擇了xs:element

要使其工作,還需要做一件事: 選擇xs:complexType ,而不是xs:element ,因為這是JAXB用來創建類而不是元素的東西。

以下應該有效:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               version="2.1">
    <jaxb:bindings schemaLocation="seda_actes.xsd">
        <jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest']
            /xs:complexType/xs:sequence/xs:element[@name='Contains']
            /xs:complexType/xs:sequence/xs:element[@name='Contains']
            /xs:complexType">
            <jaxb:class name="SecondContains"/>
        </jaxb:bindings>
         <jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest']
             /xs:complexType/xs:sequence/xs:element[@name='Contains']
             /xs:complexType/xs:sequence/xs:element[@name='Contains']
             /xs:complexType/xs:sequence/xs:element[@name='Contains']
             /xs:complexType">
            <jaxb:class name="ThirdContains"/>
        </jaxb:bindings>
    </jaxb:bindings>

</jaxb:bindings>

雖然這是一個老問題,但只是為了幫助其他人確保在最后添加“/ xs:complexType”。 所以而不是下面:

<jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest']/xs:complexType/xs:sequence/xs:element[@name='Contains']/xs:complexType/xs:sequence/xs:element[@name='Contains']">
    <jaxb:class name="SecondContains"/>
</jaxb:bindings>

它應該是:

<jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest']/xs:complexType/xs:sequence/xs:element[@name='Contains']/xs:complexType/xs:sequence/xs:element[@name='Contains']/xs:complexType">
    <jaxb:class name="SecondContains"/>
</jaxb:bindings>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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