由于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;
}
但没有成功。
欢迎任何有关此问题的有用信息/评论!
答案 0 :(得分:3)
无法在XML中的空集合和null
之间产生差异。集合通常被序列化为一系列标记(模式中的xs:sequence
),而没有表示集合本身的封闭标记。
<item value="item1"/>
<item value="item2"/>
我担心你是否获得null
和空集合将是特定于实现的,我不会依赖它。如果需要进行区分,可以将集合包装到另一个对象中,以生成封闭标记(我没有找到另一种方法来生成封闭标记)。
<items>
<item value="item1"/>
<item value="item2"/>
</items>