1

问题

我正在尝试验证强制性 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 验证。

我的设置

  • 莫哈拉 JSF 2.2.7
  • 焊接 2.2.1.Final
  • 休眠验证器 5.1.1.Final
  • 雄猫 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>
4

2 回答 2

1

不幸的是,这是“按设计工作”。未提交任何内容时,将跳过所有验证。只有<f:viewParam required>有特殊待遇。当没有提交任何内容时也会考虑它。另请参见UIViewParameter#processValidators() javadoc源代码

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

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


更新:毕竟,修复相对容易,并且已在当前 2.0 快照版本的OmniFaces中实现。 <o:viewParam>

于 2014-07-16T07:06:15.923 回答
0

在 JSF 2.0 之前,根本不对值为空或 null 的字段运行验证。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 属性,这是专家建议的性能,因为使用注释会涉及反射。所以我们至少可以避免一种情况。

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

要查看这些参数的列表,请参阅
所有与 JSF 相关的 web.xml 上下文参数名称和值的概述

希望这可以帮助。

于 2014-07-10T06:36:20.803 回答