如果f:viewParam/converter返回null,如何将人员发送到404页面?

Jon*_*her 2 jsf converter http-status-code-404 jsf-2

假设你有一个带有视图参数的页面,比如 /widgets?widgetId=1

    <f:metadata>
        <f:viewParam
            name="widgetId"
            value="#{widgetIdMB.widgetId}"
            converter="#{widgetIDConverter}" />
    </f:metadata>
Run Code Online (Sandbox Code Playgroud)

所以,少说你的转换器抛出一个ConverterException,因为有人试图导航到 /widgets?widgetId=1000000,这在数据库中是不存在的.有没有办法在发生这种情况时将此人发送到404页面?

编辑:

我使用转换器来转换值.如果无法在数据库中查找该值,则转换器将返回null,而不是抛出ConverterException.

然后我使用验证器.验证器将抛出validationexception,但在调用omnifaces实用程序类之后不会:Faces.responseSendError(404, "Not Found");

这似乎是关注点分离的最佳实现.

Bal*_*usC 5

使用ExternalContext#responseSendError()Converter,当条件满足.

context.getExternalContext().responseSendError(404, message);
context.responseComplete();
return null;
Run Code Online (Sandbox Code Playgroud)

不要忘记FacesContext#responseComplete()事后打电话,这并不是出于某种原因而暗中完成的,与此相反ExternalContext#redirect().否则,JSF会将当前页面追加到响应结束,或者IllegalStateException在它已经提交时抛出.

404您也可以使用而不是幻数HttpServletResponse.SC_NOT_FOUND.

context.getExternalContext().responseSendError(HttpServletResponse.SC_NOT_FOUND, message);
context.responseComplete();
return null;
Run Code Online (Sandbox Code Playgroud)