2

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

    <f:metadata>
        <f:viewParam
            name="widgetId"
            value="#{widgetIdMB.widgetId}"
            converter="#{widgetIDConverter}" />
    </f:metadata>

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

编辑:

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

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

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

4

1 回答 1

5

ExternalContext#responseSendError()Converter满足条件时使用。

context.getExternalContext().responseSendError(404, message);
context.responseComplete();
return null;

不要忘记FacesContext#responseComplete()事后打电话,这不是出于某种原因隐式完成的,与ExternalContext#redirect(). 否则 JSF 会将当前页面附加到响应的末尾,或者IllegalStateException在它已经提交时抛出一个。

404您也可以使用幻数代替幻数HttpServletResponse.SC_NOT_FOUND

context.getExternalContext().responseSendError(HttpServletResponse.SC_NOT_FOUND, message);
context.responseComplete();
return null;
于 2013-04-03T19:57:07.013 回答