Отказ от ответственности: Я являюсь автором JAXB2 Simplify Plugin , который может выполнять эту работу.
Давайте начнем с MCVE:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="choice" type="choiceType"/>
<xs:complexType name="choiceType">
<xs:choice>
<xs:sequence>
<xs:element name="x" type="xs:string"/>
<xs:element name="z" type="xs:string"/>
</xs:sequence>
<xs:sequence>
<xs:element name="y" type="xs:string"/>
<xs:element name="z" type="xs:string"/>
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:schema>
В результате получается такой код:
@XmlElementRefs({
@XmlElementRef(name = "x", type = JAXBElement.class, required = false),
@XmlElementRef(name = "z", type = JAXBElement.class, required = false),
@XmlElementRef(name = "y", type = JAXBElement.class, required = false)
})
protected List<JAXBElement<String>> xAndZOrY;
Хотя этот код может быть лучше с точки зрения моделирования, он выглядит странно, и большинство разработчиков предпочли бы что-нибудь попроще.Как три отдельных свойства x
, y
и z
.
. Для этого вы можете использовать JAXB2 Simplify Plugin .Вот как это делается.
Сначала добавьте JAXB2 Simplify Plugin к генерации кода JAXB.См. это руководство .С maven-jaxb2-plugin это будет выглядеть следующим образом:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<args>
<arg>-Xsimplify</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.12.0</version>
</plugin>
</plugins>
</configuration>
</plugin>
Извините, я не буду приводить конфигурации для других плагинов JAXB2 Maven здесь (например, jaxb2-maven-plugin ).
Далее необходимо указать плагин Simplify, свойство которого вы хотите упростить.Это может быть сделано либо непосредственно в схеме, либо (предпочтительным образом) через внешний файл привязки:
<jaxb:bindings
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:simplify="http://jaxb2-commons.dev.java.net/basic/simplify"
jaxb:extensionBindingPrefixes="simplify"
jaxb:version="2.3">
<jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema">
<jaxb:bindings node="xsd:complexType[@name='choiceType']">
<simplify:property name="xAndZOrY">
<simplify:as-element-property/>
</simplify:property>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
Это приводит к следующему коду:
protected List<String> x;
protected List<String> z;
protected List<String> y;
public List<String> getX() { ... }
public List<String> getZ() { ... }
public List<String> getY() { ... }
Вы можете найти полный рабочийпример здесь:
https://github.com/highsource/jaxb2-basics-support/tree/master/s/simplify-choice