我有一个Axis2 Web服务,该服务在故障响应中引发不同的详细消息以响应呼叫中的信号问题。
在某些时候,由于服务器错误(Web服务未处理的错误),在故障详细信息字符串中,我获得了所发生情况的完整堆栈跟踪。我不希望客户端看到堆栈跟踪,因此(作为捕获所有错误),我想输出一个简单的“服务器错误”消息,其中没有stacktrace,什么也没有。
拦截故障响应和更改故障消息的最简单方法是什么。模块是这样做(复杂)的唯一方法吗?
还是Axis2中有一个配置,该配置说不显示故障堆栈跟踪?
谢谢!
最佳答案
我曾经有过类似的问题。不知道是否有一些配置可以关闭显示的堆栈跟踪信息,至少我当时没有找到(这是最好的解决方案)。相反,我选择了一种快速而肮脏的方法,这主要是由于时间不足。
我所做的就是自己为Axis2提供故障的详细信息。 Axis2 Servlet具有一个称为handleFault
的方法,该方法用于处理故障。更准确地(在调用中更深入),使用MessageContextBuilder.createFaultEnvelope
方法构造故障元素。
在详细信息中包含stacktrace是默认行为,但是可以通过多种方法指定自定义详细信息。一种方法是使用AxisFault
的detail
字段,您可以在其中添加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,将添加您的详细信息。