2011-05-05 56 views
2

我的自定义ExceptionHandler中存在重定向问题。如果发生异常,ExceptionHandler应该处理NullPointerExceptions并执行重定向。这里是处理程序的一部分,负责重定向:捕捉异常后重定向的问题

FacesContext fc = FacesContext.getCurrentInstance(); 
NavigationHandler nav = fc.getApplication().getNavigationHandler(); 
nav.handleNavigation(fc, null, "error"); 

我有一个简单的页面来测试的ExceptionHandler:

<h:outputText value="#{requestTestBean.firstname}" /> 

而且在名字的吸气剂的方法我强迫一个NullPointerException :

Object x = null; 
x.toString(); 

重定向到我的错误页面,工作正常,这个小例子,但是当我在页面上增加了相当多的内容(如与许多条目和图标菜单)笔他重定向不起作用,因为响应已经在exceptionHandler方法中提交。我也尝试通过response.sendRedirect()重定向到错误页面,但也出现了相同的问题。

为什么响应已经提交?有没有任何上下文参数或其他任何东西来防止这种行为?

感谢

回答

6

这就是原因很多做干将里面的商业逻辑是一个非常糟糕的主意之一。

但是好的,让我们假设这是一个非常极端的需求/用例,其中涉及的代码不够完善(您知道,像NPE这样的运行时错误实际上是开发人员错误)。当超过某个响应主体缓冲区限制时,响应将被提交。这通常在2KB左右,真正的默认值可以在应用程序服务器级别进行配置。但是你也可以通过名称为javax.faces.FACELETS_BUFFER_SIZE的上下文参数来配置它,它接受以字节为单位的缓冲区大小。这是一个将其设置为1MB的示例。

<context-param> 
    <param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name> 
    <param-value>1048576</param-value> 
</context-param> 

它将在每个响应中设置ServletResponse#setBufferSize()

再次,这实际上是一个变通办法您的具体问题,因此一个不好的方法。真正的问题应该在代码中解决,让获取者只需返回的bean属性,而不是别的。业务逻辑需要在bean的构造函数,postconstruct或任何事件(动作)方法中完成。它们在渲染响应阶段之前执行,因此您有机会处理异常。

+0

实际上这只是一个小例子,我不认为它会在讨论如何编写好的代码时结束......在原始应用程序中,我在@PostConstruct方法中进行所有初始化,但发生相同的错误因为在RENDER_RESPONSE阶段中都调用了(getter和postconstruct方法).... - ExceptionHandler不适用于NullPointerExceptions - 它适用于某些应用程序异常,如“AuthorizationException”等。但是,感谢与缓冲区大小的提示!上下文参数不起作用,但我会尝试直接在JBoss服务器中设置缓冲区大小 – 2011-05-06 06:58:23

+0

在afterphase()侦听器中,我需要做一些安全检查并重定向到相同的'response already committed'问题如果用户不被允许访问jsf页面,则显示一个页面。这是不是一个好主意? – 2016-05-31 14:34:26