您可以为检查第一个组件的 SubmittedValue 的第二个组件指定一个特殊的验证器。我为检查相应的确认密码字段的 PasswordValidator 做了类似的事情。
@FacesValidator("passwordValidator")
public class PasswordValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component,
Object value) throws ValidatorException {
String password = (String) value;
UIInput confirmComponent = (UIInput) component.getAttributes().get("confirm");
String confirm = (String) confirmComponent.getSubmittedValue();
if (password == null || password.isEmpty() || confirm == null || confirm.isEmpty()) {
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Please confirm password", null);
throw new ValidatorException(msg);
}
if (!password.equals(confirm)) {
confirmComponent.setValid(false);
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "The entered passwords do not match", null);
throw new ValidatorException(msg);
}
}
您必须检查其他组件的提交值的原因是因为在生命周期的流程验证阶段调用了验证器。在此阶段完成并且每个提交的值都已通过验证之前,不会应用任何提交的值。