@NotNull Bean验证被viewParam忽略

时间:2014-07-09 19:26:26

标签: jsf bean-validation jsf-2.2 viewparams

问题

我正在尝试验证强制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
  • Hibernate Validator 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>

2 个答案:

答案 0 :(得分:1)

不幸的是,这是&#34;按设计工作&#34;。如果没有提交任何内容,则会跳过所有验证。只有<f:viewParam required>有特殊待遇。当没有提交任何内容时,也会考虑它。另请参阅UIViewParameter#processValidators() javadocsource code

Mojarra issue tracker中,我只能找到issue 3058作为相关问题,因此<f:validateRequired>未被考虑。从技术上讲,这与您@NotNull面临的问题实际上完全相同。我已就此创建了issue 3339

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


更新:毕竟,修补程序相对简单,并且在当前2.0快照发布中的implemented OmniFaces中已<o:viewParam>

答案 1 :(得分:0)

在JSF 2.0之前,根本没有在其值为的字段上运行验证 空或null。 JSF 2.0略微更改了此默认行为。如果正在执行JSF运行时 支持bean验证的环境,默认情况下验证空字段。除此以外, 行为与JSF 2.0之前的行为相同:未验证空字段。

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

要强制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并验证空和空字段以进行验证。

但我建议使用必需属性,这是建议专家的表现,因为使用注释可以反射。所以我们可以避免至少一个案例。

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

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

希望这有帮助。