如何“抛出”JSF2 404错误?

假设我有一个管理用户的应用程序。 您可以添加新用户,删除它们,编辑详细信息等。每个用户都有na ID,并在URL上有详细页面,如下所示:

..../user/detail.jsf?id=123 

现在,如果ID为123的用户不存在,会发生什么? 我认为自然反应将是404标准误差。 当您在URL中输入一些拼写错误(例如/user/dtail.jsf)时,完全相同。 所以问题是:有这样的方法吗?

或者这个反应(404)可能合适吗?

谢谢。

只需将validation器附加到id视图参数,如果validation失败,请在响应中设置错误代码404。

例如

考虑一下这个简单的Facelet:

         

以下支持bean:

 @ManagedBean @ViewScoped public class MyBean { private Long id; public void validate(FacesContext context, UIComponent component, Object object) { // Do some validation // And if failed: context.getExternalContext().setResponseStatus(404); context.responseComplete(); } public Long getId() { return id; } public void setId(Long id) { this.id = id; } } 

(我最终在这里搜索类似的东西,但这是我在类似问题上使用的另一种模式)

上面的Validation / ExternalContext响应是处理它的一种非常好的方法,或者(因为你已经在上下文中),你可以在从请求中解析参数并在内部处理它时处理错误。 我认为更多的是你想要在流程中处理它而不是“这是一个更好的解决方案”

 //Inside "SomeManagedBean" public String getParam() { String value = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("key"); if(value == null) return "key not Exist"; else return value; } 

// JSF 2.0 Source(something.xhtml)……

我认为以上内容通常更容易在框架内部工作(您不必发送到错误页面并破坏流程),但实际上它只是一个架构决策。 两种解决方案都很相似,只是打破流程或内部处理的问题。 无论哪种方式,ExternalContext都是你的朋友。

如上所述,您可以从托管bean中获取上下文。 我尝试了validation器方法,但对我来说它不适用,因为我使用两个参数来初始化我的bean,我确实想要抛出404.对我来说.setResponseStatus没有抛出404页面。 刚刚提供了一个非信息性的浏览器页面。 所以我使用了responseSendError。