Имеет ли клиент JAXWS разницу между пустой коллекцией и нулевым значением коллекции в качестве возвращаемого значения? - PullRequest
2 голосов
/ 12 февраля 2010

Поскольку JAX-WS полагаются на JAXB, и поскольку я наблюдал код, распаковывающий XML-компонент, в эталонной реализации JAX-B, я полагаю, что разницы нет, и клиент JAXWS всегда возвращает пустую коллекцию, даже веб-сервис результат был нулевым элементом:

public T startPacking(BeanT bean, Accessor<BeanT, T> acc) throws AccessorException {
        T collection = acc.get(bean);
        if(collection==null) {
            collection = ClassFactory.create(implClass);
            if(!acc.isAdapted())
                acc.set(bean,collection);
        }
        collection.clear();
        return collection;
    }

Я согласен, что для лучшей совместимости сервисные контракты должны быть не двусмысленными и избегать таких различий, но кажется, что вызываемая мной служба JAX-WS (размещенная на сервере Jboss с реализацией Jbossws) всегда возвращает, как ожидается, нуль пустая коллекция (протестирована с SoapUI).

Я использовал для моего тестового кода, сгенерированного wsimport. Возвращаемый элемент определяется как:

@XmlElement(name = "return", nillable = true)
protected List<String> _return;

Я даже проверял, чтобы изменить метод класса ответа Response с:

public List<String> getReturn() {
    if (_return == null) {
        _return = new ArrayList<String>();
    }
    return this._return;
}

до

public List<String> getReturn() {
    return this._return;
}

но безуспешно.

Любая полезная информация / комментарии по этой проблеме приветствуются!

1 Ответ

3 голосов
/ 12 февраля 2010

Нет никакого способа сделать разницу между пустой коллекцией и null в XML. Коллекция обычно сериализуется как последовательность тегов (xs:sequence в схеме), без включающего тега, представляющего саму коллекцию.

<item value="item1"/>
<item value="item2"/>

Боюсь, что если вы получите null и пустая коллекция, будет зависеть от реализации, и я бы не стал на это полагаться. Если вам необходимо провести различие, вы можете обернуть коллекцию в другой объект, чтобы сгенерировать вмещающий тег (я не нашел другого способа создать вмещающий тег).

<items>
  <item value="item1"/>
  <item value="item2"/>
</items>
...