我的自定义ExceptionHandler中的重定向存在问题。 ExceptionHandler应该处理NullPointerExceptions并在发生异常时执行重定向。以下是负责重定向的Handler部分:
FacesContext fc = FacesContext.getCurrentInstance();
NavigationHandler nav = fc.getApplication().getNavigationHandler();
nav.handleNavigation(fc, null, "error" );
我有一个简单的页面来测试ExceptionHandler:
<h:outputText value="#{requestTestBean.firstname}" />
在getter-first for firstname中强制一个NullPointerException:
Object x = null;
x.toString();
重定向到我的错误页面适用于这个小例子但是当我在页面上添加相当多的内容时(如带有许多条目和图标的菜单),重定向不起作用,因为响应已在exceptionHandler中提交方法。我还尝试通过response.sendRedirect()重定向到错误页面,但出现了同样的问题。
为什么响应已经提交?是否有任何上下文参数或其他任何可以阻止此行为的内容?
由于
答案 0 :(得分:7)
这是为什么在getter中执行业务逻辑是一个非常糟糕的主意的众多原因之一。
但是好吧,让我们假设这是一个非常极端的要求/用例,其中涉及到很差的代码(你知道,像NPE这样的运行时异常实际上是开发人员错误)。当超过某个响应体缓冲区限制时,将提交响应。这通常约为2KB,真正的默认值可在appserver级别配置。但您也可以通过名为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()
。
同样,这实际上是针对您的具体问题的解决方法,因此是一种糟糕的方法。真正的问题应该在代码中修复,让getter只是返回 bean属性而不是别的。业务逻辑需要在bean的构造函数,postconstruct或任何事件(动作)方法中完成。它们在渲染响应阶段之前执行,因此您有机会处理异常。