【问题标题】:Bean validation does not work for simpleSelectOneMenu in ICEFacesBean 验证不适用于 ICEFaces 中的 simpleSelectOneMenu
【发布时间】:2014-11-14 09:41:49
【问题描述】:

我使用 jsf 2.1.21、ICEFaces 3.3、Tomcat 7 和休眠验证器 5.1。组件ace:simpleSelectOneMenu 是指配置了@Min 验证的支持bean 字段。并且不执行 bean 验证。

<ace:simpleSelectOneMenu id="category" value="#{myBean.catId}" label="Category"
                         validatorMessage="Please select category">
   <f:selectItem itemValue="-1" itemLabel="Please select"/>
   <f:selectItem itemValue="0" itemLabel="Category 1"/>
   <f:selectItem itemValue="1" itemLabel="Category 2"/>      
</ace:simpleSelectOneMenu>
<h:message id="categoryMsg" for="category"/>

@ManagedBean
public class MyBean {

  @Min(0)
  private int catId;

  public int getCatId() {
     return catId;
  }

  public void setCatId(int catId) {
     this.catId = catId;
  }
}

如果使用 h:selectOneMenu 而不是 ace:simpleSelectOneMenu 则 bean 验证有效。更我看到 ace SelectOneMenu 组件已将验证器 javax.faces.validator.BeanValidator 添加到其验证器中。但是没有触发。

我想知道如何使该验证器工作? 如果使用其他 ace 组件,例如 ace:textEntry,则 bean 验证有效。

【问题讨论】:

    标签: jsf-2 icefaces-3


    【解决方案1】:

    作为一种可能的解决方案,可以使用valueChangeListener of ace:simpleSelectOneMenu

    validate phase 中调用。对于组件,由 jsf 创建验证器 javax.faces.validator.BeanValidator。所以valueChangeListener 可能会通过组件的所有验证器并触发BeanValidator 类型的验证器。捕获ValidatorException 并调用FacesContext.validationFailed() 模拟验证失败,不会调用update model phase

    <ace:simpleSelectOneMenu valueChangeListener="#{myBean.validateBean}">
    
    @ManagedBean
    public class MyBean {
        ...
        public void validateBean(ValueChangeEvent ve) {
            UIInput input = (UIInput) ve.getComponent();
            FacesContext context = FacesContext.getCurrentInstance();
            Validator[] validators = input.getValidators();
    
            for (Validator validator : validators) {
                if (validator instanceof BeanValidator) {
                    try {
                        validator.validate(context, input, ve.getNewValue());
                    }
                    catch (ValidatorException e) {
                        input.setValid(false);
                        String txt = input.getValidatorMessage();
                        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,  txt, txt);
                        context.addMessage(input.getClientId(), message);
                        context.validationFailed();
                    }
                }
            }
        }    
    

    【讨论】:

    • 很好的解决方法。验证消息可以直接从异常中获取。
    猜你喜欢
    • 2019-05-22
    • 2013-11-07
    • 2011-11-01
    • 2019-02-20
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多