我有一个Axis2 Web服务,该服务在故障响应中引发不同的详细消息以响应呼叫中的信号问题。

在某些时候,由于服务器错误(Web服务未处理的错误),在故障详细信息字符串中,我获得了所发生情况的完整堆栈跟踪。我不希望客户端看到堆栈跟踪,因此(作为捕获所有错误),我想输出一个简单的“服务器错误”消息,其中没有stacktrace,什么也没有。

拦截故障响应和更改故障消息的最简单方法是什么。模块是这样做(复杂)的唯一方法吗?

还是Axis2中有一个配置,该配置说不显示故障堆栈跟踪?

谢谢!

最佳答案

我曾经有过类似的问题。不知道是否有一些配置可以关闭显示的堆栈跟踪信息,至少我当时没有找到(这是最好的解决方案)。相反,我选择了一种快速而肮脏的方法,这主要是由于时间不足。

我所做的就是自己为Axis2提供故障的详细信息。 Axis2 Servlet具有一个称为handleFault的方法,该方法用于处理故障。更准确地(在调用中更深入),使用MessageContextBuilder.createFaultEnvelope方法构造故障元素。

在详细信息中包含stacktrace是默认行为,但是可以通过多种方法指定自定义详细信息。一种方法是使用AxisFaultdetail字段,您可以在其中添加OMElement(请参阅AXIOM)以放入故障中。因此,您可以执行以下操作:

public class MyServlet extends AxisServlet {
  ...
  public void handleFault(MessageContext msgContext, OutputStream out, AxisFault e) {
    OMFactory factory = OMAbstractFactory.getOMFactory();
    OMElement detail = factory.createElement(...);
    e.setDetail(detail);
    // now let axis do its thing with the new improved AxisFault
    super.handleFault(msgContext, out, e);
  }
}


现在,代替异常stacktrace,将添加您的详细信息。

07-24 20:37