我有两个架构a.xsd
和b.xsd
. b
进口a
。在一个元素上,a
自定义 JAXB 编译。
a.xsd:
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
targetNamespace="a"
xmlns:a="a"
jaxb:version="2.0"
elementFormDefault="qualified">
<xsd:element name="a" type="a:A1Type"/>
<xsd:complexType name="A1Type">
<xsd:sequence>
<xsd:element name="a" type="xsd:string">
<xsd:annotation>
<xsd:appinfo>
<jaxb:property name="a0"></jaxb:property>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
b.xsd:
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="b"
xmlns:a="a"
xmlns:b="b"
elementFormDefault="qualified">
<xsd:import namespace="a" schemaLocation="a.xsd"/>
</xsd:schema>
xjc -extensions a.xsd
和 .一样有效xjc -extensions a.xsd b.xsd
。但是,如果我这样做xjc -extensions -episode a.ep a.xsd
然后xjc -extensions b.xsd -b a.ep
,编译将失败并出现以下错误
[ERROR] compiler was unable to honor this property customization. It is attached to a wrong place, or its inconsistent with other bindings.
line 16 of file:/D:/episode/d/src/main/resources/a.xsd
[ERROR] (the above customization is attached to the following location in the schema)
line 13 of file:/D:/episode/d/src/main/resources/a.xsd
如果我删除<xsd:annotation>
from a.xsd
,一切正常。
为什么会出现此错误,如何使用自定义和剧集进行此操作?
编辑:我自己调查的一些发现:
我发现这个问题听起来非常相似。答案建议使用外部绑定文件而不是内联自定义。我尝试了这个并创建了一个绑定文件bindings.xjb
,包括以下内容。
<jaxb:bindings schemaLocation="a.xsd" node="/xs:schema">
<jaxb:bindings node="xs:complexType[@name='A1Type']/xs:sequence/xs:element">
<jaxb:property name="a0"></jaxb:property>
</jaxb:bindings>
</jaxb:bindings>
有了这个,两步编译工作并具有正确的自定义。如果我bindings.xjb
在第二步中包含 ie xjc -extension b.xsd -b a.ep -b bindings.xjb
,我会再次收到错误消息。
因为好奇,我将自定义包含在a
的剧集文件中并再次a.ep
尝试运行。xjc -extension b.xsd -b a.ep
这再次给出了错误。
这使我相信 JAXB/xjc 认为自定义与剧集的<class>
绑定不兼容,即使引用的类与自定义一致。
看起来,内联定制和带有剧集的模块化模式编译彼此不兼容。这是不切实际的,所以我很想在这里被证明是错误的。