Java 如何将stacktrace添加到soap fault(websphere)中
Java 如何将stacktrace添加到soap fault(websphere)中,java,soap,websphere,axis2,stack-trace,Java,Soap,Websphere,Axis2,Stack Trace,我们已经在WebSphereServer中部署了Webservice,我想询问一下控制soap故障响应的设置。我想在soap错误发生时将堆栈跟踪日志添加到reply中。我知道这在weblogic中是可能的。如何在websphere中实现这一点?或者有没有办法手动添加它(而不是通过创建自定义元素) 谢谢 编辑:我使用apache cxf生成基本java类,因此我有: @WebMethod public returnType method(param) throws CustomException
我们已经在WebSphereServer中部署了Webservice,我想询问一下控制soap故障响应的设置。我想在soap错误发生时将堆栈跟踪日志添加到reply中。我知道这在weblogic中是可能的。如何在websphere中实现这一点?或者有没有办法手动添加它(而不是通过创建自定义元素) 谢谢 编辑:我使用apache cxf生成基本java类,因此我有:
@WebMethod public returnType method(param) throws CustomException
以及制造故障
CustomExceptionWSDLType ex = new CustomExceptionWSDLType ()
throw new CustomException(error.getMessage(), ex , error);
CustomException就是例外
和CustomExceptionWSDLType是复杂类型 (均由cxf生成) 编辑2:
我使用CXF生成POJO,但Websphere使用自己的axis实现来部署我的WS。我不是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>
这应该以如上所述的方式为您提供堆栈跟踪。可能我应该提到我使用ApacheCXF从WSDL生成Java类。这很好。如果您在实现从WSDL生成的类的CXF服务中拥有此代码。该服务也与此WSDL一起部署。是的,我可以将stacktrace放入错误消息中,但这并不是我想要的。您希望stacktrace放在哪里?如果不是faultstring中的,那么您只有faultcode或fault的detail子元素。好的,我自己将它添加到自定义元素中,螺旋轴:)thx 4 help我找到了,但是axis2.xml在哪里?应该在我耳边吗?您声明您正在使用CXF。Axis2是一个不同的WS-stack。您的ear中不应该有axis2.xml,因为您没有使用axis2。Websphere使用axis2框架部署@Webservice,因此我需要关注axis。无论如何,我在plugins\org.apache.axis2.jar中找到了axis2.xml,但是设置sendStacktraceDetailsWithFaults没有效果啊,我想我现在明白了。您正在使用wsdl2java生成POJO,对吗?我强烈建议改用wsimport。该工具是JAX-WSRI的一部分(在JDK中)。有关更多上下文,请参见以下答案:
throw new CustomException(getStackTraceString(error),error);