2009-08-12 46 views
5

首先,我抛出运行时异常的所有不可恢复的异常每个异常,这将导致这些异常向上行进到容器中,在那里我目前使用错误页面(在web.xml中定义)。在这个错误页面中是一个调用记录器的scriptlet。在捕获的Java EE Web应用程序

我与这个有问题的是,异常不再是堆在这个调用上。我可以从请求范围变量(“javax.servlet.error.message”)访问它。这个字符串是堆栈跟踪。我明显需要这个堆栈跟踪记录的目的,并在不同的应用程序服务器“javax.error_message”可以关闭,出于安全原因.......

所以我的问题是,如何最好地记录运行时异常在Java EE应用程序中不包含所有内容:

try {} catch (Exception e) {logger.log(...)} 

我想一些方法来调用从说不定容器记录器...容器捕获例如例外权利之前。

+0

你在使用什么框架? Struts的?弹簧? – 2009-08-12 15:45:21

+0

这将是框架独立。我们不希望它绑定到任何特别的东西(应用程序服务器或框架)。我们实际上支持3个框架。这些是普通的j2ee/struts/JSF(特别是Oracle对JSF的适应:ADF Faces)。至于后端,PL/SQL存储过程或SQL/jdbc ...就像ADF Faces一样,它使用的ADF业务组件与Toplink类似。 – Zombies 2009-08-12 15:49:47

回答

3

我找到了解决办法。通过添加响应滤波器和包装chain.doFilter(REQ,RESP)像这样:

try { 
    chain.doFilter(req,resp); 
} catch (Exception e) { 
    logger.error("", e); 
    throw new RuntimeException(e); 
} 

到目前为止是这种情况很好,不依赖于特定的框架或应用服务器。

1

在Servlet API中没有任何东西可以实现这一点。

然而,你可以在Tomcat中有一个实例监听做到这一点。你可以在这样的context.xml安装监听器,

<InstanceListener>myapp.MyListener</InstanceListener> 

Tomcat的火灾InstanceEvent.AFTER_SERVICE_EVENT事件容器捕获异常后马上再次抛出异常之前。你可以在那里调用记录器。

+0

您是否知道这是否可以在Oracle Weblogic或Oracle Application Server中完成? – Zombies 2009-08-12 17:04:31

+0

没有与其他容器的经验。很可能他们都有类似的东西(可能没有文档),因为容器需要钩住它自己的生命周期管理。 – 2009-08-12 20:09:33

+0

似乎Oracle确实通过JSF来实现这一目标,我们将在ADF Faces(Oracle的JSF实现)上执行此操作:http://database.in2p3.fr/doc/oracle/Oracle_Application_Server_10_Release_3/web.1013 /b28967/web_val008.htm – Zombies 2009-08-13 13:34:12

0

纠正我,如果我错了,但“例外”对象存在作为你的“错误”的jsp称为“例外”变量...。您始终可以使用此对象来记录检索异常信息并登录到错误的jsp本身。