gpt4 book ai didi

java - XSD 中的嵌套元素导致 JAXB 中的非法类继承循环异常,我如何才能正确覆盖绑定(bind)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:52:36 33 4
gpt4 key购买 nike

我遇到了一个问题,我正在尝试绑定(bind)一个包含名称“Contains”三次的 XML。

所以我了解到可以使用绑定(bind)文件覆盖节点名称。目前它不起作用。

我认为错误来自绑定(bind)文件中的 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>

以及修改第二个和第三个“包含”节点的绑定(bind)文件。

<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

我遇到了这个错误:

analyse dun schéma... compilation dun schéma... Exception in thread "main" java.lang.IllegalArgumentException: Illegal class inheritance loop. Outer class SecondContains may not subclass from inner class: SecondContains at com.sun.codemodel.internal.JDefinedClass._extends(JDefinedClass.java:258) at com.sun.tools.internal.xjc.generator.bean.ImplStructureStrategy$1._extends(ImplStructureStrategy.java:104) at 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) at com.sun.tools.internal.xjc.Driver._main(Driver.java:108) at 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>

关于java - XSD 中的嵌套元素导致 JAXB 中的非法类继承循环异常,我如何才能正确覆盖绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32716132/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com