首页 > 解决方案 > 在 ViewScop 上写入 404 并在 JAVA JSF 中不重定向显示错误文件

问题描述

如果在不发送重定向404的情况下找不到 ID,我该如何抛出错误。302

在我的 ViewScop 中,我进行了选择,并希望通过显示错误页面 ( )404的内容来返回错误。404404.xhtml

我尝试了以下方法,这给了我一个302重定向到404.xhtml

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

实际上,如果我将重定向注释掉,我会得到正确的错误代码,但仍会xhtml呈现被调用的文件。

这里最好的方法是什么? SO中有很多答案,但我没有找到适合我的答案。


编辑:这里有一些来自 SO 的其他答案,这是@Ben建议的,我在其中找到了正确答案:

标签: javaerror-handlingjsf-2.2view-scope

解决方案


感谢@Ben我再次搜索并找到了正确答案:How to throw 404 from bean in jsf

解决方案是.dispatch()ExternalContext.

派遣

public abstract void dispatch(String path) throws IOException

向指定资源发送请求以为此响应创建输出。

Servlet:这必须通过调用 javax.servlet.ServletContext方法来完成getRequestDispatcher(path),并forward()在结果对象上调用方法。

如果调用getRequestDisatcher(path)返回null,则发送 aServletResponse SC_NOT_FOUND错误代码。

参数
path - 指定资源的上下文相对路径,必须以斜杠(“/”)字符开头

抛出
FacesException- 如果发生 ServletException 则抛出
IOException- 如果发生输入/输出错误

所以我的解决方案现在看起来像这样:

@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 (IOException ex) {
        }
    }
}

推荐阅读