2012-07-26 22 views
3

我有一個使用Spring和jaxb的web服務,我嘗試在某些情況下拋出一個異常,爲此我使用了@WebFault的註解。就像這樣:如何從SOAP錯誤中禁用堆棧跟蹤?

@WebFault 
public class ServiceException extends Exception { 

private static final long serialVersionUID = -5307754615848423430L; 
private FaultBean faultBean; 

public ServiceException(String message, ServiceErrorCode serviceErrorCode) { 
     super(message); 
     this.faultBean = new FaultBean(); 
     this.faultBean.setMessage(message); 
     this.faultBean.setErrorCode(serviceErrorCode); 
} 

public FaultBean getFaultInfo() { 
    return faultBean; 
} 

}

,它的做工精細,這是輸出:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <S:Fault xmlns:ns3="http://www.w3.org/2003/05/soap-envelope"> 
     <faultcode>S:Server</faultcode> 
     <faultstring>myException</faultstring> 
     <detail> 
      <ns2:ServiceException xmlns:ns2="http://soap.service.test/"> 
      <errorCode>UNRECOGNIZED_ERROR</errorCode> 
      <message>myException</message> 
     </ns2:ServiceException> 
     <ns2:exception class="ServiceException" note="To disable this feature, set com.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace system property to false" xmlns:ns2="http://jax-ws.dev.java.net/"> 
      <message>myException</message> 
      <ns2:stackTrace> 
       <ns2:frame class="myWebService" file="myWebService.java" line="50" method="listTickets"/> 
       <ns2:frame class="sun.reflect.NativeMethodAccessorImpl" file="NativeMethodAccessorImpl.java" line="native" method="invoke0"/> 
       <ns2:frame class="sun.reflect.NativeMethodAccessorImpl" file="NativeMethodAccessorImpl.java" line="39" method="invoke"/> 
       <ns2:frame class="sun.reflect.DelegatingMethodAccessorImpl" file="DelegatingMethodAccessorImpl.java" line="25" method="invoke"/> 
       <ns2:frame class="java.lang.reflect.Method" file="Method.java" line="597" method="invoke"/> 
       <ns2:frame class="com.sun.xml.ws.api.server.InstanceResolver$1" file="InstanceResolver.java" line="246" method="invoke"/> 
       <ns2:frame class="com.sun.xml.ws.server.InvokerTube$2" file="InvokerTube.java" line="146" method="invoke"/> 
       <ns2:frame class="com.sun.xml.ws.server.sei.EndpointMethodHandler" file="EndpointMethodHandler.java" line="257" method="invoke"/> 
       <ns2:frame class="com.sun.xml.ws.server.sei.SEIInvokerTube" file="SEIInvokerTube.java" line="93" method="processRequest"/> 
       <ns2:frame class="com.sun.xml.ws.api.pipe.Fiber" file="Fiber.java" line="595" method="__doRun"/> 
       <ns2:frame class="com.sun.xml.ws.api.pipe.Fiber" file="Fiber.java" line="554" method="_doRun"/> 
       <ns2:frame class="com.sun.xml.ws.api.pipe.Fiber" file="Fiber.java" line="539" method="doRun"/> 

...

所以問題是,似乎沒有正確顯示錯誤的堆棧跟蹤,因爲客戶端不關心這些細節,但無法找到方法來做到這一點,任何想法?

回答

6

堆棧跟蹤的傳播默認爲打開。 如果您認爲Web Service應用程序發送完整堆棧跟蹤並不安全,則可以關閉此功能。 我肯定要設置在服務器的VM.If是:

有效,我們需要的WLS服務器配置爲包括啓動下列選項:

-Dcom.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace=false 

對於WLS 10.3此項應包含在startWebLogic.cmd文件中。

對於獨立WLS這個文件下找到:

<WLS_HOME>/user_projects/domains/<YOUR_DOMAIN>/bin 

針對JDeveloper11克內部集成WLS它的發現下:

<JDEV_HOME>\system\system11.1.1.0.31.51.88\DefaultDomain\bin 

找到的文件的startWebLogic.cmd以下條目:

set JAVA_OPTIONS=%SAVE_JAVA_OPTIONS% 

..並將其更改爲:

set JAVA_OPTIONS=-Dcom.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace=false %SAVE_JAVA_OPTIONS% 

重新啓動WLS服務器,並用無效的SOAP有效負載重新啓動Web服務。

+1

實際我使用tomcat,但是同樣在starup腳本中添加參數-Dcom.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace = false:D – Icaro 2012-10-17 16:21:17

2

您也可以在java代碼中的系統屬性中設置它,這很簡單,並且不依賴於部署的服務器的類型。只需在服務實施調用的最開始添加以下行(粗體)即可。希望有所幫助。

實施例:

@WebService(endpointInterface = 「com.service.IMyService」) 公共類MyServiceImpl實現IMyService {

@Override 公共列表爲myService(字符串PNR)拋出MyException {

System.setProperty(「com.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace」,「false」);

}

1

這爲我工作,嘗試所有其他方法後...

import com.sun.xml.ws.fault.SOAPFaultBuilder到類

聲明一個變量SOAPFaultBuilder即:SOAPFaultBuilder soapFaultBuilder;

在你的構造函數,設置soapFaultBuilder.captureStackTrace = false;