簡體   English   中英

將服務從Axis遷移到Axis2(Java)-我應該使用哪個MessageReceiver?

[英]Migrating a service from Axis to Axis2 (Java) - Which MessageReceiver should I use?

我正在將服務從Axis遷移到Axis2(Java)。 該服務在主體中使用一些“自定義” XML響應簡單的SOAP請求,如下所示:

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

在Axis1中,服務將org.wc3.dom元素數組作為參數並對其進行處理,例如

public Element[] processMessage(Element [] elems) { ... }

如果將服務遷移到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錯誤,抱怨沒有實現所需方法簽名的方法。

我也嘗試過將OMElements數組與RPCMessageReceiver一起使用,但這會導致傳入一個空數組。

誰能提供關於我可以用來訪問SOAP請求正文中所有XML元素的哪種接收器/方法簽名組合的建議? 提前致謝。

真正的問題是Axis1服務正在處理有效的DOM,但是SOAP請求格式錯誤。 根據http://msdn.microsoft.com/zh-cn/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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM