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的目的......
你无法解释这种行为以及如何解决这个问题吗?
答案 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>
即可完成要求和长度验证。如果您打算自定义消息,可以通过requiredMessage
和validatorMessage
属性或自定义<message-bundle>
来实现。