没有指定值时不应该跳过验证吗?

Posted

技术标签:

【中文标题】没有指定值时不应该跳过验证吗?【英文标题】:Shouldn't the validation be skipped when there is no value specified? 【发布时间】:2011-09-01 02:51:16 【问题描述】:

我在 GlassFish 3 上使用 JSF2。

我有一个接受和可选电话号码的表格。我有这个自定义电话号码验证器(如下),并且我将字段设置为 required="false" 因为电话号码在表单中是可选的。

问题是,字段中的值总是得到验证。

一定是我做错了什么。任何帮助表示赞赏,谢谢!

<h:outputText value="#msg.profile_otherPhone1Label#msg.colon" />
  <h:panelGroup>
    <p:inputText label="#msg.profile_otherPhone1Label" id="otherPhone1" value="#profileHandler.profileBean.otherPhone1" required="false">
      <f:validator validatorId="phoneValidator" />
    </p:inputText>
  <p:spacer />
  <h:outputText value="#msg.profile_phoneExample" />
</h:panelGroup>

#

public class PhoneValidator implements Validator 

    @Override
    public void validate(FacesContext facesContext, UIComponent uIComponent,
            Object object) throws ValidatorException 

        String phone = (String) object;

        // count the digits; must have at least 9 digits to be a valid phone number
        // note: we're not enforcing the format because there can be a lot of variation
        int iDigitCount = 0;
        for (char c : phone.toCharArray()) 
            if (Character.isDigit(c)) 
                iDigitCount++;
            
        

        if (iDigitCount < 9) 
            FacesMessage message = new FacesMessage();
            message.setSummary(Messages.getMessage("error_phoneNumberNotValid"));
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(message);
        
    


【问题讨论】:

【参考方案1】:

从 JSF 2.0 开始,JSF 将默认验证空字段,以便与新的 Java EE 6 提供的 JSR 303 Bean 验证 API 一起使用,该 API 提供 @NotNull 等。

基本上有两种方法可以解决这个问题:

    通过web.xml 中的以下条目告诉 JSF 不要验证空字段。

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

    缺点很明显:您不能再充分利用 JSR 303 Bean Validation。


    Validator 中自己做一个空检查。

    if (object == null) return;
    

    如果您没有设置为truejavax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 上下文参数,那么您希望转换为String 并检查isEmpty()

【讨论】:

以上是关于没有指定值时不应该跳过验证吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 adf 中,当 autosubmit ="true" 时,实体验证将被跳过

添加基于策略的授权会跳过 JWT 不记名令牌身份验证检查吗?

你好,如图,OD跳过注册失败后,会提示为了验证信息的有效性。。。怎么跳过这个窗口,好像没有关键跳

JSF 跳过没有立即=真的必需验证

简单 SQL Express 完全连接查询在应该返回空值时不返回

在 keycloak 中跳过 kerberos sso 身份验证