2010-04-07 24 views
1

我正在將一個服務從Axis遷移到Axis2(Java)。該服務響應與位「定製」 XML的簡單SOAP請求在主體如下所示:將服務從Axis遷移到Axis2(Java) - 我應該使用哪個MessageReceiver?

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soapenv:Header> 
    <wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext"> 
    <UsernameToken Id="MyID"> 
    <Username>user</Username> 
    <Password>pass</Password> 
    </UsernameToken> 
    </wsse:Security> 
    <dstm:ClientType xmlns:dstm="http://schemas.company.com/My_functions">Messaging.EWS</dstm:ClientType> 
    <dstm:SessionScenario xmlns:dstm="http://schemas.company.com/My_functions">terminate</dstm:SessionScenario> 
    <dstm:Organization xmlns:dstm="http://schemas.company.com/My_functions">*</dstm:Organization> 
</soapenv:Header> 
<soapenv:Body> 
    <tt:processBodyMessage xmlns:tt="http://core.ws.com"/> 
    <GetZipCode_001 version="1.0" xmlns="http://schema.company.com/Company/1"> 
    <Get> 
    <ActionExpression>getEntity</ActionExpression> 
    </Get> 
    <ZipCodeID> 
    <Id>10003</Id> 
    </ZipCodeID> 
    </GetZipCode_001> 
</soapenv:Body> 
</soapenv:Envelope> 

在軸1,服務了org.wc3.dom元件的陣列作爲參數,並處理他們,例如

如果我將服務遷移到Axis2,我可以調用它,但調試顯示elems數組爲空。這在大多香草的services.xml使用RPCMessageReceivers:

<service name="Connector"> 
<Description> 
    Connector Service ported to Axis2 
</Description> 
<messageReceivers> 
    <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /> 
    <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/> 
</messageReceivers> 
<parameter name="ServiceClass" locked="false">com.ws.core.Service</parameter> 
</service> 

從我讀過有關Axis2的,所以一般不會有DOM在服務對象的簽名是個好主意,所以我嘗試使用AXIOM OMElements :

public OMElement processMessage(OMElement e) { ... } 

與RawXMLINOutMessageReceiver結合:

<service name="Connector"> 
<Description> 
    Connector Service ported to Axis2 
</Description> 
<operation name="processMessage"> 
     <messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/> 
</operation> 
<parameter name="ServiceClass" locked="false">com.ws.core.Service</parameter> 
</service> 

這工作好一點,但被傳遞到「E」的唯一事情是第一要素的SOAP身體。

如果我試圖改變方法簽名接受OMElements數組:

public OMElement processMessage(OMElement[] e) { ... } 

我得到一個Axis2故障抱怨沒有實現所需的方法簽名方法。

我也曾嘗試使用帶有RPCMessageReceiver OMElements數組,但這會導致一個空數組中傳遞。

能約我可以使用什麼樣的接收機/方法簽名組合的任何人提供意見,以獲得訪問SOAP請求正文中的所有XML元素?提前致謝。

回答

1

這裏真正的問題是Axis1服務正在處理有效的DOM,但格式不正確的SOAP請求。根據http://msdn.microsoft.com/en-us/magazine/bb985060.aspx,「根元素是一個非常明顯的元素,它是soap:Body或soap:Header元素的直接後代soap:Body只有一個根元素,它表示調用,響應或故障對象「。你可以看到,SOAP主體有多個根元素,這不符合標準:

<soapenv:Body> 
    <tt:processBodyMessage xmlns:tt="http://core.ws.com"/> 
    <GetZipCode_001 version="1.0" xmlns="http://schema.company.com/Company/1"> 
    ... 
    </GetZipCode_001> 
</soapenv:Body> 

最終,我選擇去與RAWXMLINOutMessageReceiver及其標準服務進入簽名:

public OMElement processMessage(OMElement e) { ... } 

如果您需要訪問此方法內的其他SOAP信封片段,則可以通過MessageContext訪問它們,例如

SOAPEnvelope envelope = MessageContext.getCurrentMessageContext().getEnvelope(); 
SOAPHeader header = envelope.getHeader(); 
SOAPBody body = envelope.getBody(); 
相關問題