У меня есть сложная иерархия Java-интерфейсов, которую я хотел бы маршалировать (и не обязательно демаршалировать) с JAXB.Эти интерфейсы представляют объекты, которые будут возвращены из REST API JAX-RS в виде XML, JSON, YAML и т. Д. (Я использую RestEasy, который может маршировать JAXB-аннотированные типы в форматах, отличных от XML.)
Проблема в том, что JAXB в основном ориентирован на класс.Я провел множество веб-исследований о трудностях с JAXB и интерфейсами, наиболее близкими из которых являются MOXy JAXB - сопоставление интерфейсов с XML и JAXB и интерфейсными моделями .Тем не менее, у меня есть две основные проблемы: а) я хочу аннотировать / работать с точки зрения интерфейсов, а не конкретных классов (которых будет несколько реализаций и содержащих значительное другое состояние, которое не должно быть маршализовано), и б) я имеюнесколько уровней наследования интерфейса.Вот пример интерфейсов, за исключением каких-либо аннотаций JAXB:
interface Uuided {
UUID getId();
}
interface Named {
String getName();
}
interface Component extends Uuided, Named {
Map<String, ComponentAttribute> getAttributes();
}
interface Attribute extends Named {
Type getType();
Object getValue();
}
interface ComponentAttribute extends Attribute {
Component getDeclaringComponent();
}
В идеале это будет генерировать что-то вроде:
<component id="xxx" name="thing">
<attributes>
<componentAttribute name="color">
<type><stringType/></type>
<value>green</value>
<declaringComponent idref="xxx"/>
</componentAttribute>
</attributes>
</component>
Ясно, что в абстрактном плане это приводит к проблемамкак определение наиболее производного аннотированного интерфейса, теоретически их может быть несколько.В моем случае, однако, я считаю, что конкретные классы реализуют только один интерфейс, который следует маршалировать.Unmarshaling не является необходимым, так как у меня есть отдельные классы, определяющие свойства upsert.
Итак, мой вопрос, возможно ли вообще работать с JAXB, и если да, то как?Даже если мне нужно быть очень явным при определении привязок, адаптеров и т. Д., Я бы хотел работать в рамках JAXB, чтобы получить выгоду от всех не XML-провайдеров в RestEasy.