2014-10-27 77 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

相關問題