【问题标题】:JSF 2.2: extend/override default required validatorJSF 2.2:扩展/覆盖默认所需的验证器
【发布时间】:2018-03-24 15:38:24
【问题描述】:

我有一种情况需要覆盖或扩展默认的所需验证器,以便在缺少所需值时可以在服务器端执行多个操作。

我只是通过扩展标准RequiredValidator来尝试它,但是只有当提交的值不为null时才会触发验证器:

import static com.util.ResourceBundleHelper.getMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.RequiredValidator;
import javax.faces.validator.ValidatorException;
import org.omnifaces.util.Ajax;

@FacesValidator("com.util.validator.AjaxRequiredValidator")
public class AjaxRequiredValidator extends RequiredValidator {

   @Override
   public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {

     //need to perform additional logic here, depending on the actual component parameter

     if (value == null || value.toString().isEmpty()){          
         String javascriptMethod = "MODULE.error(" + component.getId() +  ")";          
         Ajax.oncomplete(javascriptMethod);
         throw new ValidatorException(getMessage("error"));
     }
   }
}

xhtml:

<h:inputText value="#{bean.requiredValue}">
 <f:validator validatorId="com.util.validator.AjaxRequiredValidator"/>
</h:inputText>

我读到了上下文参数:

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

但我不想全局设置此行为,仅针对特定组件。这可能吗?

以及为什么/如何在我使用时触发默认验证器:

<h:inputText value="#{bean.requiredValue}" required="true"/>

【问题讨论】:

  • 为什么不直接删除所需的验证器?
  • 当我删除它时,会调用保存操作,我必须在保存之前手动验证模型值。还有一个问题:我需要触发错误的组件,以便我可以滚动到该特定组件,因为该页面是一个长滚动页面。
  • 如果你让你的验证器返回一个'失败,那么保存方法不会被调用
  • 当提交的值为空时,我的自定义验证器不会被调用。

标签: jsf jsf-2.2


【解决方案1】:

因为它没有伤害,我去了 web.xml 中的 context-param 解决方案:

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

 

 <h:inputText value="#{bean.requiredValue}" validator="#{bean.validateRequired}"/>

 

public interface RequiredValidation {

    default public void validateRequired(FacesContext context, UIComponent component, Object value) {
        if (value == null || value.toString().isEmpty()){          
             String javascriptMethod = "MAINMODULE.error(" + component.getId() +  ")";               
             throw new AjaxValidatorException(javascriptMethod,"fieldRequired");
        }
    }       
}   

@ManagedBean
@ViewScoped
public class Bean implements RequiredValidation {

    private String requiredValue;
    //...

}

【讨论】:

    猜你喜欢
    • 2017-06-28
    • 2021-06-07
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2020-01-17
    • 2013-02-25
    • 1970-01-01
    • 2014-04-04
    相关资源
    最近更新 更多