Я работаю над приложением, которое использует XJC для генерации Java POJO из XSD. Есть десятки схем, и это число будет расти. Приложение также должно иметь возможность обрабатывать разные версии одной и той же схемы, а это значит, что у меня будет несколько схем, определяющих общие типы. Я пытаюсь настроить привязки, чтобы определенные типы основных объектов реализовали общий интерфейс. Плагин Inheritance для JAXB2 Basics, похоже, делает то, что мне нужно, но я не могу придумать правильный синтаксис.JAXB сгенерировал классы определенных типов, реализующих настраиваемый интерфейс
Вот соответствующая часть моей схемы:
<?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 = [email protected] [xjc] SharedSecrets.getJavaNetAccess()[email protected]
Если я закомментируйте наследства: реализует линию и раскомментируйте XJC: суперинтерфейс линии, ошибка будет и сборка завершается успешно, но мои классы AddressType не реализуют тип ValidatableAddress.
Можно ли использовать модуль наследования с scd? Может ли xjc: superInterface ограничиваться только определенными элементами?
Cheers.
Спасибо lexicore. Как насчет объединения scd и xjc: superInterface ... Должны ли это работать? Любая идея, почему этот подход не генерирует ошибки, но также, похоже, не влияет на сгенерированный источник? – 6006604
... или xjc: superInterface считается настраиваемой/вендорной настройкой, аналогичной наследованию: реализует? – 6006604
На самом деле это расширение поставщика, но его расширение поставщика «первого класса», которое специально известно XJC (см. Здесь [https://github.com/gf-metro/jaxb/blob/69471fb27af6a9e990ef2a7873aab64a18e87640/jaxb-ri/ xjc/src/main/resources/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd # L81)) - в отличие от «наследования: реализует». Кстати, это не 'xjc: superInterface' для [только глобальных привязок] (https://jaxb.java.net/nonav/2.1.15/docs/vendorCustomizations.html#superinterface)? Объяснил бы, почему он игнорируется в классе. – lexicore