【问题标题】:Distinguish between conversion failure and validation failure in o:viewParamValidationFailed在 o:viewParamValidationFailed 中区分转换失败和验证失败
【发布时间】:2015-01-01 13:25:28
【问题描述】:

我在当前项目中使用OmniFaces <o:viewParam> taghandler。我喜欢它,它很棒。更大的是<o:viewParamValidationFailed>。现在,如果验证或转换失败,我们可以发送错误。但我想知道,是否可以区分转换失败和验证失败。

假设如果给定的视图参数格式错误且无法转换,我们想发送一个错误请求;就此而言,如果转换成功,则发送 Not Found,但无法在数据库中找到对象;如果用户不应访问成功获取的对象,则发送 Forbidden

有谁知道实现这一目标的方法吗?

【问题讨论】:

    标签: validation jsf omnifaces


    【解决方案1】:

    不幸的是,当您手头只有UIInput#isValid() 时,无法区分ConverterExceptionValidatorException。从理论上讲,您可以检查和测试 faces 消息以查看它是否表示转换或验证错误,但这不是一种可靠的方法,在本地化时肯定不是。

    另一方面,可以在同一个参数名称上声明多个视图参数。您不一定需要指定 value 来将其设置为模型值。

    这里是根据你的描述的例子,注意模型值只设置在最后一个:

    <o:viewParam name="foo">
        <f:converter converterId="yourFooConverter" />
        <o:viewParamValidationFailed sendError="400" />
    </o:viewParam>
    <o:viewParam name="foo">
        <f:converter converterId="yourFooConverter" />
        <f:validateRequired />
        <o:viewParamValidationFailed sendError="404" />
    </o:viewParam>
    <o:viewParam name="foo" value="#{bean.foo}">
        <f:converter converterId="yourFooConverter" />
        <f:validateRequired />
        <f:validator validatorId="yourRestrictedAccessValidator" />
        <o:viewParamValidationFailed sendError="403" />
    </o:viewParam>
    

    为避免在每次转换时调用数据库的代价高昂的工作,让YourFooConverter 实现将转换后的值存储为FacesContext 的自定义属性,然后在每次传递时检查它。

    【讨论】:

    • 它有效。做得好。我已经尝试过这种方法,但错过了在每个 viewParam taghandler 中指定转换器。
    • 我刚刚写了这个优化(将转换后的值存储为自定义属性),但显然给定的UIComponent 是每次传递的o:viewParam,因此不一致。我只需将值添加到给定的FacesContext,它在所有测试中都可以正常工作。有什么理由不这样做吗?
    猜你喜欢
    • 2020-07-22
    • 2019-08-13
    • 2018-06-19
    • 1970-01-01
    • 2018-11-15
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多