天天看點

spring boot通過Constraint和ConstraintValidator自定義參數校驗注解Constraint注解Spring boot自定義參數校驗注解

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方法省略
    }