为什么Apache CXF不尊重' nil =" true"'

时间:2014-10-27 10:40:22

标签: web-services soap cxf jax-ws

我正在为客户端和服务器使用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消息正确反序列化回客户端发送的内容?

我到处寻找答案,我很确定我错过了一些令人尴尬的事情!

编辑:添加了代码示例

2 个答案:

答案 0 :(得分:1)

架构没有nillable =&#34; true&#34; types元素的属性。因此,xsi:nil =&#34; true&#34;不是该元素的有效值。

答案 1 :(得分:0)

我找不到使CXF行为的方法(无论是在WSDL生成中还是在生成的WSDL的客户端方面)。

相反,我必须修改服务器代码以处理空值并清空字符串,就好像它们是等效的一样。

不应该需要一些黑客,但似乎有效。