我正在为客户端和服务器使用Apache CXF 3.0.2。在服务器上有一个相当简单的Web服务,它接受各种参数,其中一个是String数组:
<xs:complexType name="getThing">
<xs:sequence>
<xs:element minOccurs="0" name="connection" type="tns:connectionID"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="types" type="xs:string"/>
</xs:sequence>
</xs:complexType>
当客户端调用它时,它可能希望为&#34;类型&#34;传递单个空值。那就是我遇到问题的地方。来自客户端的SOAP消息如下所示:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getThing xmlns:ns2="http://serverl.url/">
<connection>Connection details....</connection>
<types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</ns2:getThing>
</soap:Body>
</soap:Envelope>
我认为这是正确的,但服务器上的CXF会将其转换为具有单个空字符串值的数组; 不 包含空值的数组。这会导致服务器代码出现各种问题。
服务器实现的接口是这样的吗?
ThingResult getThing(@WebParam(name = "connection") ConnectionID connection, @WebParam(name = "types") String[] types)
{ code }
如果&#39; nil =&#34; true&#34;&#39;是不是有效,那为什么CXF会生成呢?
空数组工作正常(客户端省略了消息中的元素,服务器将其解释为null),但不是包含空值的数组。为什么CXF会以这种方式运行?如何配置它以便服务器将SOAP消息正确反序列化回客户端发送的内容?
我到处寻找答案,我很确定我错过了一些令人尴尬的事情!
编辑:添加了代码示例
答案 0 :(得分:1)
架构没有nillable =&#34; true&#34; types元素的属性。因此,xsi:nil =&#34; true&#34;不是该元素的有效值。
答案 1 :(得分:0)
我找不到使CXF行为的方法(无论是在WSDL生成中还是在生成的WSDL的客户端方面)。
相反,我必须修改服务器代码以处理空值并清空字符串,就好像它们是等效的一样。
不应该需要一些黑客,但似乎有效。