【问题标题】:how to disabling the Stack Trace from the SOAP Fault?如何从 SOAP 故障中禁用堆栈跟踪?
【发布时间】:2012-07-26 16:54:30
【问题描述】:

我有一个带有 Spring 和 jaxb 的 Web 服务,在某些情况下我尝试抛出一个异常,为此我使用注释 @WebFault。就像这样:

@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"/>

...

所以问题是显示错误的堆栈跟踪似乎不正确,因为客户端不关心这些细节,但找不到这样做的方法,有什么想法吗?

【问题讨论】:

    标签: java web-services spring


    【解决方案1】:

    堆栈跟踪的传播默认开启。 如果您认为 Web 服务应用程序发送完整的堆栈跟踪不安全,您可以关闭此功能。 我确定你想在服务器的虚拟机中设置它。如果是:

    实际上,我们需要配置 WLS 服务器以在启动时包含以下选项:

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

    对于 WLS 10.3,此条目应包含在您的 startWebLogic.cmd 文件中。

    对于独立的 WLS,此文件位于:

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

    对于 JDeveloper 11g 中的集成 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 服务。

    【讨论】:

    • 其实我用的是tomcat,但是同样在启动脚本中添加参数-Dcom.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace=false :D
    【解决方案2】:

    你也可以在你的java代码的系统属性中设置,很简单,不依赖于部署的服务器类型。只需在服务实现调用的最开始添加以下行(粗体)。希望对您有所帮助。

    例子:

    @WebService(endpointInterface="com.service.IMyService") 公共类 MyServiceImpl 实现 IMyService {

    @覆盖 public List myService(String pnr) throws MyException {

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

    .

    .

    .

    }

    【讨论】:

      【解决方案3】:

      在尝试了所有其他方法之后,这对我有用...

      import com.sun.xml.ws.fault.SOAPFaultBuilder你的班级

      为 SOAPFaultBuilder 声明一个变量,即:SOAPFaultBuilder soapFaultBuilder;

      在你的构造函数中,设置soapFaultBuilder.captureStackTrace = false;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-11
        • 1970-01-01
        • 2012-08-17
        • 1970-01-01
        • 2015-09-24
        • 2016-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多