假设您有一个带有视图参数的页面,如/widgets?widgetId=1
<f:metadata>
<f:viewParam
name="widgetId"
value="#{widgetIdMB.widgetId}"
converter="#{widgetIDConverter}" />
</f:metadata>
所以,更少说你的转换器抛出ConverterException
,因为有人试图导航到/widgets?widgetId=1000000
,这在数据库中不存在。当这种情况发生时,是否有办法将用户发送到404页面?
我使用了一个转换器来转换值。如果该值无法在数据库中查找到,则转换器返回null,而不是抛出ConverterException。
然后我使用验证器。验证器将抛出一个validationexception,但不会在调用omnifaces实用程序类之后抛出:Faces.responseSendError(404, "Not Found");
这似乎是关注点分离的最佳实现。
在Converter
中满足条件时使用ExternalContext#responseSendError()
context.getExternalContext().responseSendError(404, message);
context.responseComplete();
return null;
不要忘记在之后调用FacesContext#responseComplete()
,由于某种原因,这不是隐式地完成的,与ExternalContext#redirect()
相反。否则,JSF将把当前页面附加到响应的末尾,或者在已经提交时抛出一个IllegalStateException
。
你也可以用HttpServletResponse.SC_NOT_FOUND
代替神奇的数字404
。
context.getExternalContext().responseSendError(HttpServletResponse.SC_NOT_FOUND, message);
context.responseComplete();
return null;