【问题标题】:@NotNull Bean Validation ignored for viewParam忽略 viewParam 的 @NotNull Bean 验证
【发布时间】:2014-08-30 23:33:58
【问题描述】:

问题

我正在尝试验证强制性 GET 请求参数。

在视图中我添加了相应的 viewParam 标记。

<f:metadata>
    <f:viewParam name="customerId" value="#{customerDetailBean.customerId}"/>
</f:metadata>

我的 CDI bean 看起来像这样

@Model
public class CustomerDetailBean {

    @NotNull
    private Integer customerId;

    public Integer getCustomerId() {
        return customerId;
    }

    public void setCustomerId(Integer customerId) {
        this.customerId = customerId;
    }
}

当我使用以下请求时,验证工作正常并显示预期的验证消息。

http://localhost:8080/getsupport/customerdetail.jsf?customerId=

但是,当我通过删除参数 customerId 更改请求时,将跳过验证并且不显示任何消息。

http://localhost:8080/getsupport/customerdetail.jsf

有没有办法让它按预期工作?

解决方法

我已将 viewParam 声明更改为

<f:metadata>
    <f:viewParam name="customerId" value="#{customerDetailBean.customerId}" required="true" />
</f:metadata>

该更新版本适用于第二个请求。无论如何,我更喜欢使用 bean 验证。

我的设置

  • Mojarra JSF 2.2.7
  • 焊接 2.2.1.Final
  • 休眠验证器 5.1.1.Final
  • Tomcat 7.0.54

web.xml

<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>

【问题讨论】:

    标签: jsf bean-validation jsf-2.2 viewparams


    【解决方案1】:

    不幸的是,这是“按设计工作”。未提交任何内容时,将跳过所有验证。只有&lt;f:viewParam required&gt; 有特殊处理。当没有提交任何内容时也会考虑它。另见UIViewParameter#processValidators()javadocsource code

    Mojarra issue tracker 中,我只能找到issue 3058 作为相关问题,因此&lt;f:validateRequired&gt; 没有被考虑。从技术上讲,这实际上与@NotNull 所面临的问题完全相同。我在此创建了issue 3339

    与此同时,您最好的选择是退回到required="true"。自定义组件也可以,但据我所知,这不会是微不足道的。


    更新:毕竟修复比较简单,在当前的 2.0 快照版本中,OmniFaces 中的 implemented 一直是 &lt;o:viewParam&gt;

    【讨论】:

    • 感谢 BalusC 非常清晰的解释,包括源代码参考。我非常感谢您在跟踪器中创建了一个问题。我很乐意看到这在未来按预期工作。
    • 我刚刚为 OmniFaces 2.0(快照)修复了它。查看答案更新。
    【解决方案2】:

    在 JSF 2.0 之前,根本不会对值为 空或空。 JSF 2.0 稍微改变了这个默认行为。如果 JSF 运行时在 支持 bean 验证的环境,默认验证空字段。否则, 该行为与 JSF 2.0 之前的行为相同:未验证空字段。

    由于 Tomcat(& Jetty) 不是 J2EE 兼容的服务器 bean 验证默认情况下未启用。这就是您的验证被跳过的原因。

    要强制 JSF 验证空字段,请将其添加到您的 web.xml 文件中:

     <context-param>
        <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
        <param-value>true</param-value>
     </context-param>   
    

    Bean 验证(JSR 303) 可以在不符合 j2ee 的服务器上以最少的配置进行配置(我从未配置过这个 :))。在某种程度上,您启用了 bean 验证并且您没有高于上下文参数,那么 jsf 运行时会将其视为 true 并验证空字段和 null 字段以进行验证。

    但我建议使用 required 属性,这是专家建议的性能,因为使用注释会涉及反射。所以我们至少可以避免一种情况。

    并确保上下文参数 javax.faces.validator.DISABLE_DEFAULT_BEAN_VALIDATOR 在 web.xml 中未设置为 true。

    要查看这些参数的列表,请参阅
    Overview of all JSF-related web.xml context parameter names and values

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答 Srikanth。我已将 VALIDATE_EMPTY_FIELDS 参数添加到 web.xml 但它不起作用。无论如何,bean验证设置似乎没问题。请求参数按预期得到验证(例如,?customerId= 导致错误消息)。唯一不起作用的情况是完全省略参数。在这种情况下,不会评估 @NotNull。
    • 我不太担心使用 bean 验证时的性能开销。当然,你说反射会增加一些额外的成本是对的。无论如何,JSF 在很多情况下都使用反射(例如值绑定)。
    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2014-03-08
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多