要一次验证多个字段,请在类型级别上使用注释,并编写一个自定义的验证器,以使用REGEXP检查所有字符串字段。
编辑:提供示例。这很丑陋,因为它使用了Reflection并违反了安全性,但是也许它给了您一个总体思路。如果您不使用“对象”而是一个具体的类或接口,则使用常规的吸气剂可能会成功。
被测类(和跑步者)
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)@documentedpublic @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; }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)