如何从axis2故障响应中排除stacktrace

时间:2010-09-03 09:13:48

标签: java web-services axis2 fault interceptor

我有一个Axis2 Web服务,它在故障响应中抛出不同的详细消息,以指示呼叫中的信号问题。

在某些时候,由于服务器错误(除了Web服务处理的错误之外),在错误详细信息字符串中,我得到了所发生事件的完整堆栈跟踪。我不希望客户端看到堆栈跟踪,所以(作为捕获所有错误)我想输出一个简单的“服务器错误”消息,没有堆栈跟踪,没有任何内容。

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

或者,Axis2中是否有配置说不显示故障中的堆栈跟踪?

谢谢!

3 个答案:

答案 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");
}