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);