Я работаю над приложением, которое использует XJC для создания Java POJO из XSD. Есть десятки схем, и это число будет расти. Приложение также должно иметь возможность обрабатывать разные версии одной и той же схемы, а это означает, что у меня будет несколько схем, определяющих общие типы. Я пытаюсь настроить привязки, чтобы определенные типы ядра реализовывали общий интерфейс. Плагин Inheritance 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 из-за большого (и растущего) количества схем. Я не хочу менять файл привязки каждый раз, когда мы добавляем новую схему. Таким образом, 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
Если я закомментирую строку inheritance:implements и раскомментирую строку xjc:superInterface, ошибка исчезнет, и сборка завершится успешно, но мой AddressType классы не реализуют тип ValidatableAddress.
Можно ли использовать подключаемый модуль наследования с scd? Можно ли ограничить xjc:superInterface только определенными элементами?
Ваше здоровье.