在ViewScop上写入404,并在JavaJSF中显示错误文件而不重定向

在ViewScop上写入404,并在JavaJSF中显示错误文件而不重定向,java,error-handling,jsf-2.2,view-scope,Java,Error Handling,Jsf 2.2,View Scope,如果在未发送重定向的情况下未找到ID,如何抛出错误404 在我的ViewScop中,我进行了选择,并希望返回一个错误404,显示404错误页面(404.xhtml)的内容 我尝试了下面的方法,它为我提供了一个重定向到404.xhtml的302重定向: @PostConstruct 公共无效初始化(){ data=service.select(id.getValue()); 如果(数据==null){ FacesContext context=FacesContext.getCurrentInst

如果在未发送重定向的情况下未找到ID,如何抛出错误
404

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

我尝试了下面的方法,它为我提供了一个重定向到
404.xhtml的
302
重定向:

@PostConstruct
公共无效初始化(){
data=service.select(id.getValue());
如果(数据==null){
FacesContext context=FacesContext.getCurrentInstance();
context.getExternalContext().setResponseStatus(404);
context.responseComplete();
试一试{
context.getExternalContext().redirect(“/404.xhtml”);
}捕获(IOEX异常){
}
}
}
实际上,如果我注释掉重定向,我会得到正确的错误代码,但是仍然会呈现被调用的
xhtml
文件

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


编辑:这里是SO的一些其他答案,这是我在何处找到正确答案的建议:

  • -只需设置404,而不显示404页面的内容
  • -类似的答案来自 ,再次没有显示我在
    web.xml
    中定义的404页面
  • -这正是我要找的
我再次搜索并找到了正确答案:

解决方案是在一台计算机上使用

调度

public abstract void dispatch(字符串路径)抛出IOException

向指定的资源分派请求以创建此资源的输出 答复

Servlet:这必须通过调用
javax.servlet.ServletContext
method
getRequestDispatcher(path)
,以及 对结果对象调用
forward()
方法

如果对
getrequestdisacher(path)
的调用返回
null
,则发送
aServletResponse SC\u未找到
错误代码

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

抛出
FacesException
-如果发生ServletException,则引发该异常
IOException
-如果发生输入/输出错误

现在我的解决方案是这样的:

@PostConstruct
公共无效初始化(){
data=service.select(id.getValue());
如果(数据==null){
试一试{
FacesContext context=FacesContext.getCurrentInstance();
ExternalContext=context.getExternalContext();
setResponseStatus(未找到HttpServletResponse.SC_);
externalContext.dispatch(“/404.xhtml”);
context.responseComplete();
}捕获(IOEX异常){
}
}
}

请将您在此处找到的答案添加到SO中,并解释它们如何无法解决您的问题,从而避免不必要的重做工作。