2014-10-27 93 views
0

我正在为客户端和服务器使用Apache CXF 3.0.2。在服务器上有一个允许的各种参数相当简单的Web服务,其中之一是一个字符串数组:为什么Apache CXF不尊重'nil =“true”'

<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> 

当客户端调用这个,这可能是它希望通过对“一个空值类型“,这就是我遇到问题的地方。来自客户端的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 } 

如果'nil =“true”'无效,那么为什么CXF会生成它?

空数组工作正常(客户端省略消息中的元素,服务器将其解释为null),但不包含包含空值的数组。为什么CXF以这种方式行事,我如何配置它以便服务器将SOAP消息正确地反序列化回客户端发送的内容?

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

编辑:增加代码示例

回答

0

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

相反,我不得不修改服务器代码来将null和空字符串视为等价。

有点不应该被需要的黑客,但似乎工作。

1

架构不具有的nillable =“真”的类型元素的属性。因此,xsi:nil =“true”不是该元素的有效值。

+0

那么我怎样才能得到补充?如果服务器需要重写,将会产生巨大的影响。 如果'nil =“true”'无效,那么为什么CXF会生成它?我需要在客户端设置上解决某些问题吗? – Jason 2014-10-27 16:14:11

相关问题