我不是 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 添加了一个附加元素,它只是将错误字符串重用于堆栈跟踪。
调用网络服务,我得到以下响应:
<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);
这应该以上述方式为您提供堆栈跟踪。