3

Spring と jaxb を使用した Web サービスがあり、場合によっては 1 つの例外をスローしようとします。これには、注釈 @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"/>

...

問題は、クライアントがそれらの詳細を気にしないため、エラーのスタックトレースが正しく表示されないように見えることですが、これを行う方法を見つけることができないため、アイデアはありますか?

4

3 に答える 3

6

スタック トレースの伝播は、デフォルトでオンになっています。Web サービス アプリケーションが完全なスタック トレースを送信することが安全でないと思われる場合は、この機能をオフにすることができます。サーバーの VM に設定することをお勧めします。はいの場合:

実際には、起動時に次のオプションを含めるように 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 サービスを再度呼び出します。

于 2012-10-16T10:56:49.013 に答える
2

また、Java コードのシステム プロパティで設定することもできます。これはシンプルで、デプロイされたサーバーの種類に依存しません。サービス実装呼び出しの最初に以下の行 (太字) を追加するだけです。それが役立つことを願っています。

例:

@WebService(endpointInterface="com.service.IMyService") パブリック クラス MyServiceImpl は IMyService を実装します {

@Override public List myService(String pnr) throws MyException {

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

.

.

.

}

于 2014-05-08T12:09:20.900 に答える
2

他のすべての方法を試した後、これは私にとってはうまくいきました...

import com.sun.xml.ws.fault.SOAPFaultBuilderあなたのクラスに

SOAPFaultBuilder の変数を宣言します。つまり、次のようにします。SOAPFaultBuilder soapFaultBuilder;

コンストラクターで、soapFaultBuilder.captureStackTrace = false;

于 2014-07-17T08:23:50.523 に答える