Как и было обещано, познакомьтесь с плагином Simplify .
Этот плагин позволяет упростить "сложные" свойства.Эти свойства часто генерируются из повторяющихся вариантов, таких как этот:
<xs:complexType name="typeWithReferencesProperty">
<xs:choice maxOccurs="unbounded">
<xs:element name="a" type="someType"/>
<xs:element name="b" type="someType"/>
</xs:choice>
</xs:complexType>
...
<xs:complexType name="typeWithElementsProperty">
<xs:choice maxOccurs="unbounded">
<xs:element name="a" type="xs:string"/>
<xs:element name="b" type="xs:int"/>
</xs:choice>
</xs:complexType>
По умолчанию XJC объединяет свойства, моделирующие несколько ссылок или элементов в одной.
@XmlElementRefs({
@XmlElementRef(name = "a", type = JAXBElement.class),
@XmlElementRef(name = "b", type = JAXBElement.class)
})
protected List<JAXBElement<SomeType>> aOrB;
...
@XmlElements({
@XmlElement(name = "a", type = String.class)
@XmlElement(name = "b", type = Integer.class),
})
protected List<Serializable> aOrB;
Эти сложные свойства необходимы для адекватного моделирования сложного содержимого схемы XML, то есть для поддержания порядка элементов в повторяемом выборе.К сожалению, они не идиоматичны как свойства бобов.Эти свойства являются «неоднородными» (в том смысле, что они хранят разные типы), что затрудняет работу с ними.
Однако, если порядок элементов незначителен, то есть вы можете житьс учетом того, что он изменится после повторной сортировки, структуры этих свойств могут быть упрощены: сложные свойства можно разделить на несколько простых свойств.
Плагин Simplify реализует эту задачу.Это позволяет упростить ваши сложные свойства.Плагин удалит комплексное свойство и вставит несколько более простых свойств вместо исходного (сложного) свойства.Таким образом, вы можете получить что-то вроде:
@XmlElement(name = "a", type = String.class)
protected List<String> a;
@XmlElement(name = "b", type = Integer.class)
protected List<Integer> b;
Или:
@XmlElement(name = "a")
protected List<SomeType> a;
@XmlElement(name = "b")
protected List<SomeType> b;
Или:
@XmlElementRef(name = "a", type = JAXBElement.class)
protected List<JAXBElement<SomeType>> a;
@XmlElementRef(name = "b", type = JAXBElement.class)
protected List<JAXBElement<SomeType>> b;
Зависит от настройки.
плагин будет выпущен в JAXB2 Основы 0.6.3, теперь доступен как снимок из этого хранилища .