0

我有两个架构a.xsdb.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>绑定不兼容,即使引用的类与自定义一致。

看起来,内联定制和带有剧集的模块化模式编译彼此不兼容。这是不切实际的,所以我很想在这里被证明是错误的。

4

0 回答 0