web.xml 错误页面在 FileNotFoundException 情况下不起作用

Rob*_*rto 1 error-handling jsf

我对海关错误页面及其异常类型有一些问题。我的web.xml这个错误页面中有;

<error-page>
    <exception-type>java.io.FileNotFoundException</exception-type>
    <location>/faces/error.xhtml</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

当我单击链接并且 JSF 文件不存在时,会发生此错误。我的问题是,当发生此错误时,网页不会重定向到我的error.xhtml页面。

这是如何引起的以及如何解决?

Bal*_*usC 5

FileNotFoundException当您实际请求的 URL 与FacesServlet. 因此,想象一下 被FacesServlet映射到*.jsf,然后打开/somenotexistent.jsf将在 Mojarra 确实抛出一个子类的情况下FileNotFoundException确实与您的错误页面匹配。

但是,如果您请求的 URL 与的 URL 模式FacesServlet匹配,则该请求将由另一个 servlet(通常是容器自己的 )处理DefaultServlet。如果资源不存在,那么它通常会返回 404 而不是抛出异常。

您还想添加另一个错误页面来解决这个问题:

<error-page>
    <error-code>404</error-code>
    <location>/faces/error.xhtml</location>
</error-page>
<error-page>
    <exception-type>java.io.FileNotFoundException</exception-type>
    <location>/faces/error.xhtml</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

然而,为了防止这种重复,您还可以考虑使用servlet 过滤器,它捕获FileNotFoundException来自的任何实例FacesServlet,然后正确返回 404。JSF 实用程序库OmniFaces已经有这样的过滤器,FacesExceptionFilter. 这样你最终只能看到错误代码为 404 的错误页面。