JSR-303 Bean验证注释了多个字段

JSR-303 Bean验证注释了多个字段,第1张

JSR-303 Bean验证注释了多个字段

要一次验证多个字段,请在类型级别上使用注释,并编写一个自定义的验证器,以使用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;    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5506497.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存