java - 在 ViewScop 上写入 404 并在 JAVA JSF 中不重定向显示错误文件
问题描述
如果在不发送重定向404
的情况下找不到 ID,我该如何抛出错误。302
在我的 ViewScop 中,我进行了选择,并希望通过显示错误页面 ( )404
的内容来返回错误。404
404.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建议的,我在其中找到了正确答案:
- 如何“抛出”JSF2 404 错误? - 只设置404而不显示404页面的内容。
- 如果 f:viewParam / 转换器返回 null,如何将人发送到 404 页面?- 来自@BalusC的类似回答
,再次没有显示我在
web.xml
. - 如何在 jsf 中从 bean 中抛出 404 -这正是我想要的!
解决方案
感谢@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) {
}
}
}
推荐阅读
- scala - 可以在 Scala 中具有相同列数的表上完成联合
- wordpress - WordPress: Show Simple Posts based on categories on Custom Post Type Single page
- python - 如何在基于 timerseries pandas 的 matplot 上画一条线将其显示为趋势
- python - Unable to change a 'str' into an 'int', can only use float
- java - Retrofit Android + Spring Boot Server 图片上传返回 Bad Request 错误
- mongodb - my mongod is not working its keep giving me error in hyper terminal
- python - python copy() and remove()
- swagger-codegen - 如何修复丢失的招摇输入或配置?
- amazon-web-services - AWS ECS Farget 集群中的远程呈现之类的替代方案?
- xamarin - Xamarin Forms IOS App 在 Database.Migrate() 上失败