私は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>
編集:コード内の変数が例外であると仮定して、error
throwステートメントを次のように変更できます
throw new CustomException(getStackTraceString(error),error);
これにより、上記の方法でスタックトレースが提供されます。