Jaxb marshaller всегда пишет xsi:nil (даже когда @XmlElement(required=false, nillable=true))

У меня есть свойство java с аннотацией @XmlElement(required=false, nillable=true). Когда объект маршалируется в xml, он всегда выводится с атрибутом xsi:nil="true".

Есть ли опция jaxbcontext/marshaller, чтобы указать маршаллеру не записывать элемент, а не записывать его с помощью xsi:nil?

Я искал ответы на этот вопрос, а также просмотрел код, afaics, он всегда будет писать xsi:nil, если nillable = true. Я что-то пропустил?


person Keith    schedule 05.05.2011    source источник


Ответы (1)


Если свойство помечено @XmlElement(required=false, nillable=true) и значение равно null, оно будет записано с xsi:nil="true".

Если вы аннотируете его только @XmlElement, вы получите поведение, которое вы ищете.

импортировать javax.xml.bind.annotation.XmlAccessType; импортировать javax.xml.bind.annotation.XmlAccessorType; импортировать javax.xml.bind.annotation.XmlElement; импортировать javax.xml.bind.annotation.XmlRootElement;

Пример

Учитывая следующий класс:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElement(nillable=true, required=true)
    private String elementNillableRequired;

    @XmlElement(nillable=true)
    private String elementNillbable;

    @XmlElement(required=true)
    private String elementRequired;

    @XmlElement
    private String element;

}

И этот демонстрационный код:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Root root = new Root();

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        marshaller.marshal(root, System.out);
    }

}

Результат будет:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <elementNillableRequired xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    <elementNillbable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</root>
person bdoughan    schedule 05.05.2011
comment
Спасибо, это то, что я видел в коде. Я не хотел менять аннотации, так как это был сгенерированный код, а также потому, что это точное отражение схемы xml (в которой элементы определены как minoccurs='0' и nillable='true'). - person Keith; 09.05.2011
comment
FWIW, похоже, что @XmlElement(required=false) также приводит к желаемому поведению. - person Matt Ball; 12.05.2011
comment
Хммм... Я знаю, что это старо, но элемент elementRequired, являющийся нулевым, должен на самом деле вызывать ошибку (правильно?)... потому что его нуль еще требуется. В моем случае мы используем cxf/SOAP. - person Jack; 25.10.2012
comment
Я пытаюсь расширить ваш пример, где элемент elementNillableRequired имеет атрибут, а затем он не работает. Он создает недопустимый элемент. Я просто устанавливаю атрибут и допускаю значение null: ‹elementNillableRequired status=N /› (nillable отсутствует) - person hudi; 16.02.2015
comment
@hudi - я рассмотрю соответствующий вопрос, который вы разместили: xsd" title="jaxb создает недопустимый нулевой элемент при генерации xml против xsd"> stackoverflow.com/questions/28537873/ - person bdoughan; 16.02.2015
comment
@BlaiseDoughan, ты уже проверил мой вопрос? буду очень благодарен за вашу помощь - person hudi; 24.02.2015