[英]Nested elements in XSD cause Illegal class inheritance loop exception in JAXB, how can I properly override the bindings?
I have got a problem, I'm trying to bind an XML where there are the name ' Contains ' three times. 我有一个问题,我正在尝试绑定一个名为' Contains '三次的XML。
So I read that it's possible to override node names with a binding file. 所以我读到可以使用绑定文件覆盖节点名称。 At the moment it doesn't work.
目前它不起作用。
I think mistake come from Xpath in the binding file, but I not sure. 我认为错误来自绑定文件中的Xpath,但我不确定。 I have tried lot of way, but I have never succeed.
我已经尝试了很多方法,但我从未成功过。
There is my XSD File : 有我的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>
And the binding file to modify the second and the thirs 'Contains' node. 并修改第二个和第三个'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>
But when I execute the following xjc command : 但是当我执行以下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
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
I have got this error : 我有这个错误:
analyse dun schéma... compilation dun schéma... Exception in thread "main" java.lang.IllegalArgumentException: Illegal class inheritance loop.
分析dunchéma...编译dunshéma...线程中的异常“main”java.lang.IllegalArgumentException:非法的类继承循环。 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)
外类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)
Any ideas will be appreciated :) 任何想法将不胜感激:)
Thank you. 谢谢。
You wrote: 你写了:
<jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest'] /xs:complexType/xs:sequence/xs:element[@name='Contains'] /xs:complexType/xs:sequence/xs:element[@name='Contains']">
I took your XSD and fixed it to make it a legal document. 我拿了你的XSD并修好了它,使它成为一份法律文件。 Then I took your XPath expressions, they selected the
xs:element
correctly. 然后我拿了你的XPath表达式,他们正确选择了
xs:element
。
There's only one more thing you need to do to make this working: select the xs:complexType
, not the xs:element
, because that is what JAXB uses to create the classes, not the elements. 要使其工作,还需要做一件事: 选择
xs:complexType
,而不是xs:element
,因为这是JAXB用来创建类而不是元素的东西。
The following should work: 以下应该有效:
<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>
Though it's an old question but just to help others make sure to add the "/xs:complexType" at the end. 虽然这是一个老问题,但只是为了帮助其他人确保在最后添加“/ xs:complexType”。 So instead of below:
所以而不是下面:
<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>
It should be as: 它应该是:
<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.