我有一个Axis2 Web服务,它在故障响应中抛出不同的详细消息,以指示呼叫中的信号问题。
在某些时候,由于服务器错误(除了Web服务处理的错误之外),在错误详细信息字符串中,我得到了所发生事件的完整堆栈跟踪。我不希望客户端看到堆栈跟踪,所以(作为捕获所有错误)我想输出一个简单的“服务器错误”消息,没有堆栈跟踪,没有任何内容。
拦截故障响应和更改故障消息的最简单方法是什么。模块是(复杂)这样做的唯一方法吗?
或者,Axis2中是否有配置说不显示故障中的堆栈跟踪?
谢谢!
答案 0 :(得分:1)
我曾经遇到过类似的问题。不确定是否有一些配置可以关闭显示的堆栈跟踪,至少在那一刻我找不到(这本来是最好的解决方案)。相反,我选择了一种快速而肮脏的方法,主要是由于时间不够。
我所做的是自己为Axis2提供故障的细节。 Axis2 servlet有一个名为handleFault
的方法,用于处理生成错误。更确切地说(在调用中更深入)MessageContextBuilder.createFaultEnvelope
方法用于构造故障元素。
在详细信息中使用堆栈跟踪是默认行为,但有一些方法可以指定自定义详细信息。一种方法是使用AxisFault
的{{1}}字段,您可以在其中添加detail
(请参阅AXIOM)以放入故障中。所以你做了类似的事情:
OMElement
现在,不是异常堆栈跟踪,而是添加您的详细信息。
答案 1 :(得分:0)
Axis2使用Apache commons日志记录,您看到的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 user guide以获取有关如何设置邮件的日志记录级别和目标的说明。
希望这有帮助。
答案 2 :(得分:-1)
你能不能只抓住AxisFault
try {
// do stuff
} catch (AxisFault f) {
log.error("Encountered error doing stuff", f);
throw new IOException("Server error");
}