2


我们已经将 Webservice 部署到 websphere 服务器中,我想询问有关控制肥皂故障响应的设置。当肥皂故障发生时,我想将堆栈跟踪日志添加到回复中。我知道这在 weblogic 中是可能的。如何在 websphere 中实现这一点?或者有没有办法手动添加它(不是通过创建自定义元素)?

谢谢

编辑:我使用 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:我使用 CXF 生成 POJO,但 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 添加了一个附加元素,它只是将错误字符串重用于堆栈跟踪。

调用网络服务,我得到以下响应:

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

这应该以上述方式为您提供堆栈跟踪。

于 2012-08-22T09:29:37.180 回答