从验证器内部访问请求参数

时间:2009-06-24 15:44:34

标签: jboss seam

是否有正确的方法从验证器内部访问其他表单字段? 是否有另一种解决方案:

context.getViewRoot().findComponent("formid:exampleField:example")?

f.e我想在自定义验证器中验证城市字段并检查国家/地区是否为美国。

1 个答案:

答案 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;
}