Преобразуйте nil="true" в null во время демаршальной операции

Я получаю XML с сервера, схема которого определяет почти каждый элемент как:

<xs:element name="myStringElementName" type="xs:string" nillable="true" minOccurs="0"/>
<xs:element name="myIntElementName" type="xs:int" nillable="true" minOccurs="0"/>

Я пытаюсь найти чистый способ конвертировать каждый полученный мной элемент, помеченный как xsi:nil="true" в ноль, когда он демаршируется в объект JAXB. Так что-то вроде этого:

<myIntElementName xsi:nil="true" />

Должен привести к тому, что мой объект JAXB имеет myIntElementName свойство со значением NULL, а не JAXBElement объект со свойством nil, установленным в true (или что-либо подобное). Я не имею никакого контроля над системой, которая отправляет мне XML, который использует nillable атрибут, поэтому мне нужно преобразовать это на моем конце, когда я получу его.

1 ответ

Решение

@XmlElement(nillable= истина)

Вам просто нужно указать @XmlElement(nillable=true) на вашем поле / свойстве, чтобы получить это поведение:

@XmlElement(nillable=true)
private String foo;

Генерация из XML-схемы

Ниже я продемонстрирую, как создать это отображение, если вы смотрите на схему XML.

Схема XML (schema.xsd)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="foo">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="myStringElementName" type="xs:string"
                    nillable="true" minOccurs="0" />
                <xs:element name="myIntElementName" type="xs:int"
                    nillable="true" minOccurs="0" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Почему вы получаете свойство типаJAXBElement

Свойство типа JAXBElement генерируется в вашей модели, потому что у вас есть нуль-элемент, это minOccurs="0", Использование JAXBElement позволяет модели различать отсутствующий элемент (свойство имеет значение null) и наличие элемента с nil="true" (JAXBElement с установленным нулевым флагом).

<xs:element name="myStringElementName" type="xs:string"
                        nillable="true" minOccurs="0" />

Внешний файл привязки (binding.xml)

Можно указать внешний файл привязки, чтобы указать реализации JAXB не генерировать какие-либо свойства типа JAXBElement, Обратите внимание, что это сделает невозможным для JAXB круговую передачу всех документов XML.

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="2.0"
               xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
    <jaxb:bindings>
        <jaxb:globalBindings generateElementProperty="false"/>
    </jaxb:bindings>
</jaxb:bindings>

XJC Call

Ниже приведен пример использования внешнего файла привязки из вызова XJC.

xjc -b binding.xml schema.xsd

Сгенерированная модель (Foo)

Сгенерированная модель будет выглядеть примерно так:

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "myStringElementName",
    "myIntElementName"
})
@XmlRootElement(name = "foo")
public class Foo {

    @XmlElement(nillable = true)
    protected String myStringElementName;
    @XmlElement(nillable = true)
    protected Integer myIntElementName;

    public String getMyStringElementName() {
        return myStringElementName;
    }

    public void setMyStringElementName(String value) {
        this.myStringElementName = value;
    }

    public Integer getMyIntElementName() {
        return myIntElementName;
    }

    public void setMyIntElementName(Integer value) {
        this.myIntElementName = value;
    }

}

Для дополнительной информации

Другие вопросы по тегам