如何在没有抛出NullPointerException的ExternalContext#dispatch()的情况下设置404错误页面?

时间:2018-06-21 15:26:56

标签: java jsf-2.2 view-scope

当ID无效时,我尝试引发404错误,因此我使用了以下方法:How to throw 404 from bean in jsf使用ExternalContext#dispatch()

此刻我的initialize()无效作品:

@PostConstruct
public void initialize() {
    data = service.select(id.getValue());
    if (data == null) {
        try {
            FacesContext context = FacesContext.getCurrentInstance();
            ExternalContext externalContext = context.getExternalContext();
            externalContext.setResponseStatus(HttpServletResponse.SC_NOT_FOUND);
            externalContext.dispatch("/404.xhtml");
            context.responseComplete();
        } catch (FacesException | IOException ex) {
        }
    }
}

但是它会在以下情况下生成NullPointerException

  

org.apache.catalina.core.StandardWrapperValve.invoke路径为[]的Servlet [Faces Servlet]的Servlet.service()引发异常[过滤的请求失败。]根本原因    java.lang.NullPointerException

指向的位置(请参见注释行):

public class CharacterEncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response); // <-- NullPointerException
    }    
    // [...]    
}

我认为这与以下问题有关:NullpointerException in getExternalContext in FacesContext,而BalusC的答案很有意义:

  

永远不要使用ExternalContext#dispatch()。此方法没有单一   体面的JSF Web应用程序中的合理用例。它只会腐败   JSF生命周期,因为它会在JSF生命周期内创建另一个FacesContext   当前请求。

但是如何在不抛出NullPointerException的情况下获得相同的结果?

0 个答案:

没有答案