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