spring boot通过Constraint和ConstraintValidator自定义参数校验注解

Constraint注解

在spring boot进行开发的时候,有时需要对请求的参数进行校验, 而@Constraint可以实现自定义的校验注解。

Spring boot自定义参数校验注解

  1. 如果Spring boot是2.3.0之后的版本,需要引入新的依赖

    		<dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-validation</artifactId>
            </dependency>
    
  2. 编写自定义注解处理文件

    /**
     * 自定义注解处理类必须实现ConstraintValidator接口, 其中StringValidator是自己定义的注解, 而String是注解标注参数的类型
     */
    public class MyValidator implements ConstraintValidator<StringValidator, String> {
    
        private Integer value;
    
        // 获取自定义中value属性的值
        @Override
        public void initialize(StringValidator constraintAnnotation) {
            this.value = constraintAnnotation.value();
        }
    
        // 自定义注解处理程序, 返回true则通过自定义注解的校验, 返回false则是没有通过自定义注解的校验,并返回自定义注解中message的内容
        @Override
        public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
            System.out.println("isValid:" + s);
            
            // 如果校验的参数属性不为空,并且字符串的字符大于自定义注解中标注的值,则通过注解校验
            if (s != null && !s.equals("") && s.length() > this.value) {
                return true;
            }
            return false;
        }
    
    }
    
  3. 自定义注解

    /**
     * String类型验证
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
    @Constraint(validatedBy = MyValidator.class)
    public @interface StringValidator {
    
        int value();
    
        // 如果没有通过注解校验, 则打印message
        String message() default "字符串错误";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }
    
  4. 编写controller类

    @RestController
    public class TestController {
    
        // 在要校验的属性之前必须加上@Valid注解
        @PostMapping(value = "/")
        public Object testConstraintValidator(@Valid User user) {
    
            return "这是一个测试";
        }
    }
    
  5. 编写User类

    public class User {
    
        // 此处使用了自定义注解, 要求name的长度必须超过4个字符
        @StringValidator(value = 4)
        private String name;
    
        private Integer age;
    
        // ...此处实体类的构造方法和Getter,Setter方法省略
    }
    
    
Spring的后台Check注解是用于进行参数校验的,它可以用于控制器方法的参数上,用于校验参数的合法性。如果需要自定义Check注解,可以按照以下步骤进行操作: 1. 定义注解类型 ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) @Documented @Constraint(validatedBy = MyCheckValidator.class) // 自定义校验器 public @interface MyCheck { String message() default "参数校验不通过"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } ``` 2. 定义注解校验器 ```java public class MyCheckValidator implements ConstraintValidator<MyCheck, String> { @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 对value进行校验校验通过返回true,否则返回false return value != null && value.startsWith("my"); } } ``` 3. 注册注解校验器 ```java @Configuration public class ValidatorConfig { @Autowired private Validator validator; @PostConstruct public void init() { ValidatorFactory validatorFactory = Validation.byDefaultProvider() .configure() .constraintValidatorFactory(new SpringConstraintValidatorFactory()) .buildValidatorFactory(); ValidatorContext validatorContext = validatorFactory.usingContext(); validatorContext.addConstraintValidator(MyCheck.class, new MyCheckValidator()); } } ``` 以上是自定义Check注解的步骤,其中需要注意的是,自定义注解需要使用@Constraint注解进行标注,并指定对应的校验器;校验器需要实现ConstraintValidator接口,并重写isValid方法进行参数校验;最后需要在配置类中注册自定义校验器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值