JAXWS客户端是否将空集合和空集合值之间的区别作为返回值?

时间:2010-02-12 08:41:51

标签: java xml web-services jax-ws

由于JAX-WS依赖于JAXB,并且因为我观察了在JAX-B参考实现中解压缩XML bean的代码,我想差异并没有发生,并且JAXWS客户端总是返回一个空集合,甚至是webservice结果是一个null元素:

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服务(托管在具有Jbossws实现的Jboss服务器上)总是按预期返回null空集合(使用SoapUI测试)。

我用于wsimport生成的测试代码。 返回元素定义为:

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

我甚至测试过改变Response类getReturn方法:

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

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

但没有成功。

欢迎任何有关此问题的有用信息/评论!

1 个答案:

答案 0 :(得分:3)

无法在XML中的空集合和null之间产生差异。集合通常被序列化为一系列标记(模式中的xs:sequence),而没有表示集合本身的封闭标记。

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

我担心你是否获得null和空集合将是特定于实现的,我不会依赖它。如果需要进行区分,可以将集合包装到另一个对象中,以生成封闭标记(我没有找到另一种方法来生成封闭标记)。

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