如果以前的验证器失败,如何跳过验证?

时间:2015-08-07 11:02:39

标签: validation jsf jsf-2

Mojarra 2.1

我需要在其中一个验证器失败后停止验证输入值。这是我试过的:

public class SimpleNameValidator implements Validator{

    private static final int MAX_LENGHT = 32; 

    @Override
    public void validate(FacesContext context, UIComponent component,
            Object value) throws ValidatorException {
        String v = (String) value;
        FacesMessage msg;
        if(v.equals(StringUtils.EMPTY)){
            msg = new FacesMessage("Name is empty");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(msg);
        }
        if(v.length() >= MAX_LENGHT){
            msg = new FacesMessage("Name is too long"));
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(msg);
        }

    }
}

验证人:

public class CustomValidator implements Validator{

    private NameService nameService;

    @Override
    public void validate(FacesContext context, UIComponent component,
            Object value) throws ValidatorException {
        String name = nameService.getName((String) value);
        if(name != null) {
            FacesMessage msg = new FacesMessage("The name already exists");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(msg);
        }
    }

    public NameService getNameService() {
        return nameService;
    }

    public void setNameService(NameService nameService) {
        this.nameService = nameService;
    }

}

disabled

但它没有用。我不明白它为什么没有,因为我明确地指定了第二个验证器的<input type="number" value="{{ bom.Id._Value }}" name="id" data-ng-model="bom.Id._Value" data-ng-blur="myClass.myFunc($event);" required> 属性。因此,它一定不应用,因为第一个失败了。也许我误解了validationFailed的目的......

你无法解释这种行为以及如何解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

<f:validator disabled>属性在视图构建期间进行评估,此时验证程序即将附加到组件。在执行验证之前,它没有被评估。

您可以通过以下方式解决此问题:

  • validate()方法内部,只需通过UIInput#isValid()检查组件是否有效。

    if (!((UIInput) component).isValid()) {
        return;
    }
    
    // ...
    
  • 使用JSF实用程序库<o:validator>OmniFaces。它支持EL的所有属性的延迟评估。这是一个改进了disabled属性检查的示例。

    <o:validator binding="#{customValidator}" disabled="#{not component.valid}"/>
    

    #{component}引用当前的UIComponent实例,如果<h:inputXxx>组件的实例为UIInput,则该实例具有isValid()属性

对具体问题

无关,只需required="true"<f:validateRequired><f:validateLength>即可完成要求和长度验证。如果您打算自定义消息,可以通过requiredMessagevalidatorMessage属性或自定义<message-bundle>来实现。