Может ли JAXB использовать базовый тип для известного элемента с неизвестным типом? - PullRequest
2 голосов
/ 02 сентября 2011

С учетом XSD, подобного следующему:

<!-- ... -->
    <xsd:element name="MyElement" type="ParentType" />
<!-- ... -->
<xsd:complexType name="ParentType">
    <xsd:sequence>
        <!-- ... -->
        </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ChildType1">
    <xsd:complexContent>
        <xsd:extension base="ParentType">
            <xsd:sequence>
                <!-- ... -->
            </xsd:sequence>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>
<!-- ... -->

может ли JAXB2 быть настроен на откат к базовому типу ParentType, когда он должен отменять вызов XML, который содержит элемент неизвестного типа, как вследующий пример:

<!-- ... -->
<MyElement xsi:type="ChildType2">
    <!-- ... -->
</MyElement>
<!-- ... -->

Обычно в этой ситуации JAXB генерирует исключение, которое говорит, что ChildType2 является нераспознанным типом.

1 Ответ

2 голосов
/ 02 сентября 2011

Это не совсем то, что вам нужно, но вы можете использовать @XmlAnyElement для демарширования неизвестных типов в качестве элементов DOM.

Рассмотрим класс Customer с полем extrasпомечены всеобъемлющим @XmlAnyElement.

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
    @XmlElement
    private String name;
    @XmlAnyElement
    private List<Element> extras = new ArrayList<Element>();

    public String getName() {
        return name;
    }

    public List<Element> getExtras() {
      return extras;
    }
}

Образец xml:

<?xml version="1.0" encoding="UTF-8"?>
<customer>
    <name>John Doe</name>
    <salary>1000</salary>
    <age>45</age>
</customer>

Salary и Age являются неизвестными типами и сохраняются в нашем списке дополнений, когдамы демаршируем:

JAXBContext jc = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Customer customer = (Customer) unmarshaller.unmarshal(reader);
System.out.println(customer.getName());
for (Element el : customer.getExtras()) {
    System.out.println(el.getNodeName() + "->"
               + el.getTextContent());

Вывод:

John Doe
salary->1000
age->45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...