我在我的JSF 2.2 webapp中有一个web.xml中的自定义异常映射,如下所示。
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Project</display-name>
<!-- Welcome page -->
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<session-config>
<!-- some codes-->
</session-config>
<error-page>
<exception-type>se.telenor.ocfd.service.api.exception.CustomNotFoundException</exception-type>
<location>/not_found.xhtml</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.xhtml</location>
</error-page>
<error-page>
<location>/500.xhtml</location>
</error-page>
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/session_timeout.xhtml</location>
</error-page>
</web-app>
我的例外是
@ApplicationException
public class CustomNotFoundException extends RuntimeException {
private static final long serialVersionUID = 1L;
public CustomNotFoundException(String message, Throwable cause) {
super(message, cause);
}
public CustomNotFoundException(String message) {
super(message);
}
}
但是当发生异常时,它会not redirect me to not_found.xhtml
页面,而是always redirect to 500.xhtml
页面。
如果有任何遗漏,有人可以帮助我。
答案 0 :(得分:3)
如果异常包含在另一个异常中,例如, FacesException
或ELException
,取决于谁是第一个捕获实际异常的人,并以包装形式将其进一步委托给调用者。然后,这只会与<error-page>
完全匹配<exception-type>
或FacesException
的{{1}}。
解决这个问题的一种方法是创建一个servlet filter,它在ELException
方法中执行以下操作:
doFilter()
通过try {
chain.doFilter(request, response);
}
catch (ServletException e) {
Throwable cause = e.getRootCause();
if (cause instanceof FacesException || cause instanceof ELException) {
throw new ServletException(cause.getCause()); // Unwrap and rethrow it.
}
else {
throw e;
}
}
的网址格式将其映射到FacesServlet
或应用程序范围。
如果您碰巧使用JSF实用程序库OmniFaces,则可以使用即用型解决方案FacesExceptionFilter
。