2

我有一个 Axis2 Web 服务,它在对调用中的信号问题的故障响应中抛出不同的详细消息。

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

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

或者,Axis2 中是否有配置说不显示堆栈跟踪错误?

谢谢!

4

3 回答 3

1

我曾经遇到过类似的问题。不确定是否有一些配置可以关闭堆栈跟踪显示,至少当时我找不到(那将是最好的解决方案)。相反,我选择了一种快速而肮脏的方法,主要是因为时间不够。

我所做的是亲自向 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);
  }
}

现在,将添加您的详细信息,而不是异常堆栈跟踪。

于 2010-09-09T20:11:18.133 回答
0

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 用户指南以获取有关如何设置日志记录级别和消息目的地的说明。

希望这可以帮助。

于 2010-09-17T06:29:14.560 回答
-1

你能不能抓住AxisFault

try {
    // do stuff
} catch (AxisFault f) {
    log.error("Encountered error doing stuff", f);
    throw new IOException("Server error");
}
于 2010-09-03T09:21:39.550 回答