Должен ли ответ веб-службы содержать пустые значения?

При вызове веб-службы я получаю динамический ответ в формате XML.

Таким образом, ответ может быть:

<response>
<test1>test1</test1>
<test2>test1</test2>
<test3>test1</test3>
<test4>test1</test4>
</response>

или же:

<response>
<test1>test1</test1>
<test2>test1</test2>
</response>

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

Так что вместо

<response>
<test1>test1</test1>
<test2>test1</test2>
</response>

Это должно быть:

<response>
<test1>test1</test1>
<test2>test1</test2>
<test3></test3>
<test4></test4>
</response>

Это означает, что теперь я могу обработать ответ и проверить пропущенные данные.

Правильно ли я думаю?

2 ответа

Решение

Пустое представление по умолчанию

По умолчанию реализация JAXB (JSR-222) будет рассматривать свойство как необязательный элемент. Как таковые, нулевые значения представляются как элемент, отсутствующий в документе.

Альтернативное представление Null

В качестве альтернативы у вас есть нулевое значение, представленное xsi:nil="true" атрибут на это. Это достигается путем аннотирования вашей собственности @XmlElement(nillable=true),

<date xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>

Неверное нулевое представление

Пустой элемент не является допустимым представлением для нуля. Он будет обрабатываться как пустая строка, которая будет недействительной для всех нестроковых типов.

<date/>

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


Обновить

SO test1 test1 является действительным ответом, но поля test3 и test4 будут иметь значение null?

Что происходит, так это то, что ничего не делается для полей / свойств, которые соответствуют отсутствующим узлам. Они сохранят там значения по умолчанию, которые по умолчанию инициализируются как null,

Модель Java (Root)

В классе модели ниже я инициализировал поля, чтобы иметь значения, которые не являются null,

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    @XmlElement
    String foo = "Hello";

    String bar = "World";

    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

}

демонстрация

Документ составляется <root/> не имеет никаких элементов, соответствующих сопоставленным полям / свойствам в классе модели.

import java.io.StringReader;
import javax.xml.bind.*;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StringReader xml = new StringReader("<root/>");
        Root root = (Root) unmarshaller.unmarshal(xml);

        System.out.println(root.foo);
        System.out.println(root.bar);
    }

}

Выход

Мы видим, что значения по умолчанию были выведены. Это показывает, что операция набора не была выполнена для отсутствующих узлов.

Hello
World

Обратитесь к JAXB Marshalling с нулевыми полями, а также Какова цель minOccurs, nillable и ограничений?

использование @XmlElement(nillable = true) для отображения этих пустых / пустых полей значений; но обратите особое внимание на ваши поля даты.

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