JSR-303 Bean Validation注释多个字段

时间:2012-03-21 11:46:32

标签: java bean-validation

我刚刚开始测试JSR-303 Bean验证,并想知道是否有可能。我们的app中有一个默认的正则表达式,用于所有String字段。如果我想使用bean验证来应用它,我想我需要在表单对象中注释每个字段。

@Pattern(regexp = REG_EXP)
private String aString;

@Pattern(regexp = REG_EXP)
private String anotherString;

是否可以在一次点击中将@Pattern应用于所有字符串(或某些字段)?我们在Weblogic 10.3.4上使用Hibernate实现,JSF2.0作为前端。验证应该独立于视图,因为我可能会从Web服务进入。

2 个答案:

答案 0 :(得分:2)

要一次验证多个字段,请在type-Level上使用注释,并编写一个自定义Validator,使用您的REGEXP检查所有String字段。

编辑:提供示例。这非常难看,因为它使用了Reflection并违反了安全性,但它可能会给你一个大概的想法。如果你不使用“对象”而是使用具体的类或接口,你可能会成功使用常规的getter。

受测试的班级(和跑步者)

   import javax.validation.Validation;
import javax.validation.Validator;

import validation.AllStringsRegex;

@AllStringsRegex(value="l")
public class UnderValidation {
    String a;
    String b;

   public static void main(String... args) {
       UnderValidation object = new UnderValidation();
       object.a = "hello";
       object.b = "world";

       Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
       System.out.println(validator.validate(object));
   }
}

我的注释:

@Target( { TYPE, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = AllStringsRegexValidator.class)
@Documented
public @interface AllStringsRegex {
    String message() default "String not regex";
    String value() default "";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

我的验证员

public class AllStringsRegexValidator implements ConstraintValidator<AllStringsRegex, Object> {
    private Pattern pattern = null;

    @Override
    public void initialize(AllStringsRegex annotation) {
        pattern = Pattern.compile(annotation.value());
    }

    @Override
    public boolean isValid(Object object, ConstraintValidatorContext ctx) {
        for (Field f : object.getClass().getDeclaredFields()) {
            if (f.getType().equals(String.class)) {
                try {
                    f.setAccessible(true);
                    String value = (String)f.get(object);
                    if (!pattern.matcher(value).find()) {
                        return false;
                    }
                }
                catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return true;
    }
}

答案 1 :(得分:0)

我没有使用java支持脚本在服务器端使用groovy,javascript ..。你可以检查@ScriptAssert(lang = "javascript", script =_this.startDate.before(_this.endDate)脚本注释,这是hibernate注释。