我有一个 Axis2 Web 服务,它在对调用中的信号问题的故障响应中抛出不同的详细消息。
在某些时候,由于服务器错误(Web 服务处理的错误除外),在故障详细信息字符串中,我得到了所发生事件的完整堆栈跟踪。我不希望客户端看到堆栈跟踪,所以(作为捕获所有错误)我想输出一个简单的“服务器错误”消息,没有堆栈跟踪,什么都没有。
拦截故障响应和更改故障消息的最简单方法是什么。模块是(复杂的)这样做的唯一方法吗?
或者,Axis2 中是否有配置说不显示堆栈跟踪错误?
谢谢!
我有一个 Axis2 Web 服务,它在对调用中的信号问题的故障响应中抛出不同的详细消息。
在某些时候,由于服务器错误(Web 服务处理的错误除外),在故障详细信息字符串中,我得到了所发生事件的完整堆栈跟踪。我不希望客户端看到堆栈跟踪,所以(作为捕获所有错误)我想输出一个简单的“服务器错误”消息,没有堆栈跟踪,什么都没有。
拦截故障响应和更改故障消息的最简单方法是什么。模块是(复杂的)这样做的唯一方法吗?
或者,Axis2 中是否有配置说不显示堆栈跟踪错误?
谢谢!
我曾经遇到过类似的问题。不确定是否有一些配置可以关闭堆栈跟踪显示,至少当时我找不到(那将是最好的解决方案)。相反,我选择了一种快速而肮脏的方法,主要是因为时间不够。
我所做的是亲自向 Axis2 提供故障的详细信息。Axis2 servlet 有一个方法调用handleFault
来处理生成故障。更准确地说(在调用的更深处),该MessageContextBuilder.createFaultEnvelope
方法用于构造故障元素。
在详细信息中包含堆栈跟踪是默认行为,但有一些方法可以指定您的自定义详细信息。一种方法是使用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);
}
}
现在,将添加您的详细信息,而不是异常堆栈跟踪。
Axis2 使用 Apache 公共日志记录,您看到的 AxisFault 消息是由 Axis2 中的代码生成的,类似于:
try { executeMethod(httpClient, msgContext, url, getMethod); handleResponse(msgContext, getMethod); } catch (IOException e) { log.info("Unable to sendViaGet to url[" + url + "]", e); throw AxisFault.makeFault(e); } finally { cleanup(msgContext, getMethod); }
【此代码段来自org.apache.axis2.transport.http.HTTPSender】
因此,请参阅apache commons logging 用户指南以获取有关如何设置日志记录级别和消息目的地的说明。
希望这可以帮助。
你能不能抓住AxisFault
try {
// do stuff
} catch (AxisFault f) {
log.error("Encountered error doing stuff", f);
throw new IOException("Server error");
}