我尝试了omniFaces的AjaxExceptionHandler(这非常有帮助),并将其配置为捕获
java.lang.Throwable和源自所有类型请求的异常(不仅仅是ajax请求).
它工作得很好,但是当开发人员拼错EL表达式时,它不会捕获javax.el.PropertyNotFoundException.
所以问题是:如何使用JSF2的ExceptionHandlerFactory机制处理javax.el.PropertyNotFoundException?
最佳答案
FullAjaxExceptionHandler
应该能够处理它.您的具体问题可能是因为您有一个相对较大的页面溢出了Facelets的默认缓冲区大小2KB,因此响应已经在抛出异常时提交.提交响应时,响应的一部分已发送到客户端.无法将已发送的字节恢复,并在错误页面中显示新响应.不使用ajax时会遇到完全相同的问题.异常将被记录,客户端将陷入半熟的页面.
您可能希望将默认响应缓冲区大小增加到大约最大HTML响应的大小.这样,响应将在第一个字节发送到客户端之前在服务器的内存中完全生成和缓冲.您可以通过web.xml中的javax.faces.FACELETS_BUFFER_SIZE上下文参数设置它,缓冲区大小以字节为单位.以下示例将其设置为64KB.
<context-param>
<param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name>
<param-value>65535</param-value>
</context-param>
您可能只想在开发/测试环境中设置它,以便可以发现视图端的任何错误,并且实时环境可以继续使用默认缓冲区大小来节省服务器内存.