XJC - 编译器无法遵守此类自定义

时间:2016-11-07 14:54:32

标签: java maven xsd jaxb

我想从我的Java项目调用ISAN Restful API,所以我尝试使用maven-jaxb2-plugin从xsd文件生成java bean。这是xsds:

我下载了这些文件并将它们复制到我的src / main / resources文件夹中并定义了一个目录。 当我构建项目时,我收到一个错误,因为两个类型具有相同的名称:

org.xml.sax.SAXParseExceptionpublicId: http://www.isan.org/schema/v1.11/common/language; systemId: http://www.isan.org/schema/v1.11/common/language.xsd; lineNumber: 39; columnNumber: 48; A class/interface with the same name "org.isan.CodingSystemType" is already in use. Use a class customization to resolve this conflict.
org.xml.sax.SAXParseExceptionpublicId: http://www.isan.org/schema/v1.11/common/country; systemId: http://www.isan.org/schema/v1.11/common/country.xsd; lineNumber: 39; columnNumber: 48; (Relevant to above error) another "CodingSystemType" is generated from here.

这是正确的:language.xsd和country.xsd都定义了一个名为CodingSystemType的类型:

    <xs:simpleType name="CodingSystemType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="ISO639_2"/>
            <xs:enumeration value="RFC3066"/>
        </xs:restriction>
    </xs:simpleType> 

    <xs:simpleType name="CodingSystemType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="ISO3166_1"/>
        </xs:restriction>
    </xs:simpleType> 

根据建议,我尝试使用country.xsd类型的类自定义。我在pom.xml中添加了这个绑定:

<bindings>
    <binding>
        <url>http://www.isan.org/schema/v1.11/common/country.xjb</url>
    </binding>
</bindings>

xjc文件:

<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:annox="http://annox.dev.java.net"
    xmlns:namespace="http://jaxb2-commons.dev.java.net/namespace-prefix">
    <bindings schemaLocation="http://www.isan.org/schema/v1.11/common/country.xsd">

        <bindings node="//xs:simpleType[@name='CodingSystemType']">
        <class name="CountryCodingSystemType" />
        </bindings>

    </bindings>
</bindings>

现在,我收到另一个我无法处理的错误:

[ERROR] Error while parsing schema(s).Location [ http://www.isan.org/schema/v1.11/common/country.xjb{7,58}].
com.sun.istack.SAXParseException2; systemId: http://www.isan.org/schema/v1.11/common/country.xjb; lineNumber: 7; columnNumber: 58; compiler was unable to honor this class customization. It is attached to a wrong place, or its inconsistent with other bindings.
[ERROR] Error while parsing schema(s).Location [ http://www.isan.org/schema/v1.11/common/country.xsd{39,48}].
com.sun.istack.SAXParseException2; systemId: http://www.isan.org/schema/v1.11/common/country.xsd; lineNumber: 39; columnNumber: 48; (the above customization is attached to the following location in the schema)

2 个答案:

答案 0 :(得分:2)

尝试

<bindings node="//xs:simpleType[@name='CodingSystemType']">
    <typesafeEnumClass name="CountryCodingSystemType" />
</bindings>

代替。

我认为XJC在自定义枚举和普通类之间有所不同。请参阅相关问题:

答案 1 :(得分:1)

我会添加另一个答案,因为它会涉及与架构编译不同的主题。

我还注意到这两种简单类型实际上属于不同的命名空间。因此,它们实际上不应该首先在同一个包中生成。

我猜您只需使用generatePackageorg.isan指定为目标包。因此,所有命名空间最终都在一个包中,这非常糟糕。如果每个命名空间有一个包,则JAXB效果最佳。如果你不这样做会很奇怪。

因此,我通常不鼓励使用generatePackage,而是使用jaxb:package

  <bindings schemaLocation="http://www.isan.org/schema/v1.11/common/country.xsd">
    <schemaBindings>
      <package name="org.isan.schema.v1_11.common.country"/>
    </schemaBindings>
  </bindings>

我还建议使用主要/次要架构版本的包名称。您可能需要稍后并行支持多个模式版本。