java web应用程序中的RuntimeException处理

时间:2012-09-07 07:44:09

标签: java hibernate tomcat web-applications wicket

我遇到了一个有趣的目标,这个目标针对用wicket和hibernate框架编写的现有Web应用程序中的异常处理, 假设我们有部署在服务器中的Web应用程序,有时会产生运行时异常,问题是如何在不修改所有类(大约80个模型和150个视图)的情况下获取并保存堆栈跟踪到db。

希望我明确表示清楚 提前致谢。

3 个答案:

答案 0 :(得分:6)

您可以使用IRequestCycleListener来记录/处理例外情况:

public class MyExceptionReporter extends AbstractRequestCycleListener {

    @Override
    public IRequestHandler onException(RequestCycle cycle, Exception ex) {
        // log exception here
        return null;
        // if you want to also show an error page:
        // return new RenderPageRequestHandler(new PageProvider(new ExceptionPage(ex)));
    }
}

然后在WebApplication#init注册:

getRequestCycleListeners().add(new MyExceptionReporter());

答案 1 :(得分:5)

Wicket 1.4及更早版本

覆盖Application.newRequestCycle()并返回覆盖RequestCycle.logRuntimeException()的自定义WebRequestCycle子类,以便为应用程序中的所有RuntimeException提供其他日志记录行为。请注意,任何未被捕获的Exception都会被Wicket包裹在WicketRuntimeException中(如Request cycle and request cycle processor异常处理部分所述):

在那里,使用Service / DAO组件将异常消息与stacktrace一起插入数据库。请记住,根据dbms,您可能希望使用CLOB而不是varchar类型(例如,在Oracle中,varchar列不能容纳超过4000个字节)。

这是一个(未经测试的)示例:

public class myApplication extends WebApplication { 
    ...
    @Override
    public RequestCycle newRequestCycle(Request request, Response response) {
        return new myRequestCycle(this, (WebRequest) request, (WebResponse) response);
    }
} 

public class myRequestCycle extends WebRequestCycle { 
    ...
    @Override
    protected void logRuntimeException(RuntimeException rex) {
        super.logRuntimeException(rex);
        Writer w = new StringWriter();
        t.printStackTrace(new PrintWriter(w));
        String stackTrace = w.toString();
        someService.logExceptionToDB(rex.getMessage(),stackTrace);
    } 
} 

Wicket 1.5及更高版本

请参阅@Cristoph's answer

答案 2 :(得分:0)

编写一个使用StackTraceElement []的实用程序,为您提供完整的堆栈跟踪。使用OutputStream的实现将其推送到CLOB对象。 (我认为不需要BLOB)