我正在开发一个使用 XJC 从 XSD 生成 Java POJO 的应用程序。有几十种模式,而且这个数字还会增长。应用程序还需要能够处理同一模式的不同版本,这意味着我将有多个定义通用类型的模式。我正在尝试自定义绑定,以便某些核心类型实现通用接口。JAXB2 Basics 的继承插件似乎可以满足我的需要,但我似乎无法确定正确的语法。
这是我的架构的相关部分:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="http://example.com/core"
targetNamespace="http://example.com/core"
xmlns:xml="http://www.w3.org/XML/1998/namespace">
...
<xs:complexType name="addressType">
<xs:sequence>
<xs:element name="Address" type="xs:string"/>
<xs:element name="City" type="xs:string"/>
<xs:element name="Province" type="xs:string"/>
<xs:element name="Country" type="xs:string"/>
<xs:element name="County" type="xs:string" minOccurs="0"/>
<xs:element name="PostalCode" type="xs:string"/>
</xs:sequence>
</xs:complexType>
...
</xs:schema>
...这就是我的自定义绑定文件的样子:
<?xml version="1.0"?>
<jaxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
xmlns:my="http://example.com/core"
jaxb:extensionBindingPrefixes="inheritance"
version="2.1">
<jaxb:bindings scd="x-schema::my" xmlns:my="http://example.com/core">
<jaxb:globalBindings localScoping="toplevel">
<jaxb:serializable/>
<xjc:simple/>
</jaxb:globalBindings>
<jaxb:bindings scd="/type::my:addressType">
<inheritance:implements>com.mysite.validator.ValidatableAddress</inheritance:implements>
<!--<xjc:superInterface name="com.mysite.validator.ValidatableAddress"/>-->
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
我使用的是scd方法,因为在所有展示如何使用继承插件的“传统”绑定示例中,都指定了schemaLocation。我想避免因为我们的大量(并且不断增长的)模式而必须指定schemaLocation 。我不想每次添加新模式时都必须更改绑定文件。所以,scd似乎可以满足这个要求。
但是,当我使用上述绑定运行构建时,我得到了这个:
[xjc] [ERROR] cvc-elt.1: Cannot find the declaration of element 'inheritance:implements'. [xjc] line 18 of file:/dev/workspace/my_app/etc/schemas/bindings-common.xml [xjc] failure in the XJC task. Use the Ant -verbose switch for more details [xjc] classLoader = java.net.URLClassLoader@ebcdbb [xjc] SharedSecrets.getJavaNetAccess()=java.net.URLClassLoader$7@14562c5
如果我注释掉继承:实现行并取消注释xjc:superInterface行,错误就会消失并且构建成功完成,但是我的AddressType类没有实现 ValidatableAddress 类型。
继承插件可以与scd一起使用吗?xjc:superInterface 可以仅限于某些元素吗?
干杯。