JSR-303 Bean Validation注释多个字段

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

@Pattern(regexp = REG_EXP) private String aString; @Pattern(regexp = REG_EXP) private String anotherString; 

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

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

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

被测class(和跑步者)

  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[] payload() default {}; } 

我的validation员

 public class AllStringsRegexValidator implements ConstraintValidator { 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; } } 

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