在ViewHandler#createView()

时间:2015-06-23 08:11:37

标签: jsf custom-error-pages viewhandler

我已经通过这种方式在我的web.xml中为错误404定义了错误页面:

<error-page>
    <error-code>404</error-code>
    <location>/common/messages/pageNotFoundError.jsf</location>
</error-page>

处理无效页面网址按预期工作 - 用户被重定向到pageNotFoundError页面。

我还在faces-config.xml中定义了自定义视图处理程序。视图处理程序重写方法createView(FacesContext context,String viewId)。

现在是问题 - 当页面包含具有无效路径的图形图像时(我无法避免,因为用户可以自己定义路径),createView方法被调用两次。一次使用viewId =当前页面ID(如我所料)和一次使用viewId =“/ common / reports / pageNotFoundError.jsf”。有没有办法区分createView方法“正常”页面创建与404(或任何其他)错误处理(我不想比较viewId字符串)?或者也许在这种情况下不应该调用createView方法 - 在这种情况下我的问题是如何更改配置以实现此目的?

1 个答案:

答案 0 :(得分:2)

当servlet容器调度到错误页面时,它将在当前HTTP servlet请求中设置一堆特殊的错误页面相关属性。密钥由RequestDispatcher类中的ERROR_XXX个常量字段值标识。其中,ERROR_REQUEST_URI密钥可以使用为其分派错误页面的原始请求URI。如果这不是null,那么您知道正在调度错误页面,并且您立即拥有原始请求URI。

换句话说,

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
String originalURI = (String) ec.getRequestMap().get(RequestDispatcher.ERROR_REQUEST_URI);

if (originalURI != null) {
    // An error page was dispatched for the given original URI.
} else {
    // We're most likely in the normal flow.
}