我使用 JAX-WS (v 2.2.5) 的 Metro 实现,并且我的 WSDL 是在服务器上自动生成的。
我已经定义了 WS 方法:
@WebMethod
public String myMethod(@XmlElement(nillable=false) String[] array, @XmlElement(nillable=false) String field);
问题是 'nillable=false' 不适用于数组。自动生成的 WSDL 是:
<xs:element name="array" type="xs:string" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="field" type="xs:string"/>
我在 Metro 源代码中找到了以下片段(类:AbstractWrapperBeanGenerator,方法:processXmlElement):
boolean nillable = nav.isArray(type) || (elemAnn != null && elemAnn.nillable());
如果我将此片段更改为:
boolean nillable = (elemAnn != null && elemAnn.nillable());
一切正常。
你知道为什么会这样吗?
你知道如何改变这种行为,但没有考虑到:
更改默认 Metro 源代码
使用包装类而不是数组(对于纯 JAXB 一切正常)
将我的实现更改为首先使用手动更正的 WSDL