2011-06-12 62 views
6

我有一些WSDL,我需要從中生成一個Web服務實現。我使用Eclipse和Axis1.4,並運行在Weblogic9.2上。如何從Axis Web服務返回(自定義)SOAPFault?

生成服務器樁很好,我已經實現了我需要的代碼。然而,爲了與我們正在模擬的exise實現兼容,我需要爲某些指定的錯誤條件返回SOAP錯誤。

也就是說,我需要響應的SOAP體看起來像這個例子:

<soapenv:Body> 
    <soapenv:Fault> 
     <faultcode xmlns:ns1="foobar">ns1:1234</faultcode> 
     <faultstring>The supplied parameter name ABCD is not recognised.</faultstring> 
     <detail> 
      <FaultDetail>An error processing the web service [MyService]: Unknown parameter:ABCD</FaultDetail> 
      <ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">planet</ns2:hostname> 
     </detail> 
    </soapenv:Fault> 
</soapenv:Body> 

從(多)谷歌搜索,我想我應該可以通過拋出一個SOAPFaultException做到這一點。但消息存根只會拋出java.rmi.RemoteException,所以我嘗試將SOAPFaultException傳遞給RemoteException。這給了我這樣的東西:

<soapenv:Body> 
     <soapenv:Fault> 
     <faultcode>soapenv:Server.userException</faultcode> 
     <faultstring>java.rmi.RemoteException: My remote exception; nested exception is: 
    javax.xml.rpc.soap.SOAPFaultException: soap fault string</faultstring> 
     <detail> 
      <ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">myhostname</ns1:hostname> 
     </detail> 
     </soapenv:Fault> 
    </soapenv:Body> 

......換句話說,它沒有導致SOAP錯誤。

我嘗試了很多其他的東西,我幾乎卡住了。那麼有人可以告訴我(理想情況下是一個例子),在我的環境中,如何返回一個SOAP錯誤響應和我可以指定的內容?

我並不喜歡使用Axis(但我比其他任何東西都有更多的經驗)。如果你建議一個替代方案,請注意我需要在Web服務方法中調用另一個(經過身份驗證的)Web服務,並且我只能使它在Axis1.4中工作......

回答

3

你的第二個代碼帖子是SOAP錯誤(請注意soapenv:Body內的soapenv:Fault)。

基本上所有框架的默認行爲是返回標準的SOAP錯誤,併爲您提供在錯誤代碼,錯誤字符串和錯誤詳細信息字段中輸入自己的信息的功能。

參見軸1例外文檔:http://ws.apache.org/axis/java/apiDocs/org/apache/axis/AxisFault.html

它有一個設置各種領域的QName構造函數,所以你應該能夠有引用您自己的項目。

許多人將使用故障細節字段並使用DOM在其內部序列化它們自己的XML類型。

最後但並非最不重要Axis1的黃金時間大約在2000-2004年,你會發現很難得到答案和支持。大多數人已經從Axis1移動到Apache CXF,Axis2,或者直接向上
JAX-WS(現在包含在JDK6 +中)。還有Spring Web Services項目,該項目提供堆棧中所有行爲(編組,執行的bean等)的完全自定義。

只是所有這些框架都使用WSS4J來提供Web服務安全性,並且可以支持標準的用戶名令牌,令牌等。儘管如此,一旦獲得基本消息來回傳遞,您可能會必須研究WS-Security的細節。

+0

謝謝。我設法錯過了這是一個SOAP錯誤。我不清楚如何在那裏獲取自己的信息,儘管據我所知,我只能在該方法中引發一個RemoteException - 因此我可以構建一個AxisException,但我不知道如何扔它....無論如何,關閉實驗一些。在Axis1時代,是的,我同意,但儘管玩了很多,但我從來沒有通過Axis2進行認證,我也找不到有關使用CXF提升SOAPFault的詳細信息。 Weblogic9.2(我堅持使用)是Java1.5,因此直接的JAX-WS選項也不存在。 – 2011-06-12 17:42:53

+0

D'dh,從您的鏈接頁面:「public class AxisFault extends java.rmi.RemoteException」。我會去試驗... – 2011-06-12 17:43:55

+1

實驗工作。用精心設計的XML爲細節投擲AxisFault完美運行。謝謝! – 2011-06-12 18:39:04