2


websphere サーバーに Webservice をデプロイしましたが、soap fault 応答を制御するための設定についてお尋ねします。SOAP障害発生時のリプライにスタックトレースログを追加したい。私はそれがweblogicで可能であることを知っています。Websphereでこれを達成する方法は? または(カスタム要素を作成するのではなく)手動で追加する方法はありますか?

ありがとう

EDIT:Apache cxfを使用してベースJavaクラスを生成するので、次のようになります:

@WebMethod public returnType method(param) throws CustomException

障害の作成

CustomExceptionWSDLType ex = new CustomExceptionWSDLType ()
throw new CustomException(error.getMessage(), ex , error);

CustomException は Exception で、
CustomExceptionWSDLType は複合型です (両方とも cxf によって生成されます)。

EDIT2: POJO の生成に CXF を使用しますが、Websphere は独自の軸実装を使用して WS をデプロイします。

4

1 に答える 1

1

私はWebsphereの専門家ではないため、これを実行できる構成オプションがあるかどうかはわかりません。

または、(カスタム要素を作成するのではなく)手動で追加する方法はありますか?

障害をスローした場合は、いつでも詳細を追加したり、Webサービスの障害文字列とコードを変更したりできます。さて、障害を構築してスローする方法はたくさんありますが、あなたのWebサービスがそれをどのように行うのかわかりません。これは、例外のスタックトレースを障害文字列に入れる非常に簡単な例です。

   @WebMethod
public void throwFault(){
    try {
        SOAPFactory factory = SOAPFactory.newInstance();            
        IndexOutOfBoundsException e = new IndexOutOfBoundsException("index out of bounds");         
        SOAPFault fault = factory.createFault(getStackTraceString(e), new QName("http://whatever.com","CustomFault"));          
        throw new SOAPFaultException(fault);
    } catch (SOAPException e) {
        // ignore for the example           
    }
}

private String getStackTraceString(Exception e){
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    e.printStackTrace(pw);
    return sw.toString();
}

メソッドthrowFaultはサービスによって公開され、新しいを作成してスローするだけSOAPFaultです。これは、コードでは異なって見える場合があります。プライベートメソッドgetStackTraceStringは、スタックトレースを文字列表現に変換します。

このソリューションは、WSDLに要素を追加し、スタックトレースに障害文字列を再利用するだけです。

Webサービスを呼び出すと、次の応答が返されます。

 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
 <S:Body>
 <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
  <faultcode xmlns:ns0="http://whatever.com">ns0:CustomFault</faultcode> 
  <faultstring>java.lang.IndexOutOfBoundsException: index out of bounds at Faulter.throwUndeclaredFault(Faulter.java:23) at  <!--rest of stacktrace omitted for readability--!> </faultstring> 
 </S:Fault>
  </S:Body>
  </S:Envelope>

編集:コード内の変数が例外であると仮定して、errorthrowステートメントを次のように変更できます

throw new CustomException(getStackTraceString(error),error);

これにより、上記の方法でスタックトレースが提供されます。

于 2012-08-22T09:29:37.180 に答える