Преобразуйте 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;
}
}
Для дополнительной информации