是否有正确的方法从验证器内部访问其他表单字段? 是否有另一种解决方案:
context.getViewRoot().findComponent("formid:exampleField:example")?
f.e我想在自定义验证器中验证城市字段并检查国家/地区是否为美国。
答案 0 :(得分:1)
重新阅读你的问题,我将把它解释为:
“您想编写一个自定义验证程序,检查是否存在城市字段,国家/地区字段等于'US'”
所以,我会以下列方式看待这个问题:
首先创建一个验证器接口:
@Documented
@ValidatorClass(value=CountryEqualsUSValidator.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface CountryEqualsUS {
String message() default "The country should be US for the city provided";
}
然后创建一个验证器类:
public class CountryEqualsUSValidator implements Validator<CountryEqualsUS> {
public void initialize(CountryEqualsUS arg0) {
}
public boolean isValid(Object value) {
if(value != null && value instanceof YourBeanClass) {
YourBeanClass yourBeanClass = (YourBeanClass) value;
if(/*some test logic here*/) {
return true;
else {
return false;
}
}
return false;
}
}
然后在您要验证的类上:
@CountryEqualsUS
public class YourBeanClass {
...
}
然后,最后,在您的控制器/操作类上,提交表单时,城市是您要检查国家/地区的值,添加此方法并调用它:
public boolean doValidation(YourBeanClass yourBeanClass) {
ClassValidator requestValidator = new ClassValidator(yourBeanClass.getClass());
InvalidValue[] validationMessages = requestValidator.getInvalidValues(yourBeanClass);
if (validationMessages != null && validationMessages.length > 0) {
for (int i = 0; i < validationMessages.length; i++) {
//Add a validation message to be displayed to the user
}
return false;
}
return true;
}