Constraint注解
在spring boot進行開發的時候,有時需要對請求的參數進行校驗, 而
@Constraint
可以實作自定義的校驗注解。
Spring boot自定義參數校驗注解
- 如果Spring boot是2.3.0之後的版本,需要引入新的依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
- 編寫自定義注解處理檔案
/** * 自定義注解處理類必須實作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; } }
- 自定義注解
/** * 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 {}; }
- 編寫controller類
@RestController public class TestController { // 在要校驗的屬性之前必須加上@Valid注解 @PostMapping(value = "/") public Object testConstraintValidator(@Valid User user) { return "這是一個測試"; } }
- 編寫User類
public class User { // 此處使用了自定義注解, 要求name的長度必須超過4個字元 @StringValidator(value = 4) private String name; private Integer age; // ...此處實體類的構造方法和Getter,Setter方法省略 }