SpringBoot中如何自定義自己的Valid註解
阿新 • • 發佈:2018-12-12
在專案的開發中,在後臺介面中,我們經常需要對前端傳來的資料進行校驗,一般都是使用@Valid註解,但是有的時候我們的校驗工作比較複雜,@Valid提供的註解無法滿足我們的需求,這個時候我們就需要自己來定義我們自己所需的Valid註解。有同學不清楚@Valid註解的可以看一下我的另一篇文章Spring的資料校驗。
首先我們來定義一個介面來實現我們的@Valid註解
@Target({ElementType.METHOD,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = MyConstraintValidator.class) public @interface MyConstraint { String message() ; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; }
其中:@Target —— 表示這個註解可以作用在什麼地方,例如作用在方法上,或作用在某個欄位上。
@Retention —— 被它所註解的註解保留多久,runtime表示不僅被儲存到class檔案中,jvm載入class檔案之後,仍然存在
@Constraint —— 表示我們判斷邏輯的具體實現類是什麼。
再來定義我們的具體實現類的程式碼:
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Object> { @Override public void initialize(MyConstraint constraintAnnotation) { System.out.println("my validator init"); } @Override public boolean isValid(Object value, ConstraintValidatorContext context) { String name = (String)value; if ("tom".equals(name)) { return true; } System.out.println(value); return false; } }
其中實現的ConstraintValidator介面中的兩個引數,第一個引數就我們定義的介面,第二個引數表示這個註解作用在什麼型別的欄位上,比如:我們這個定義的註解是隻作用在String型別時,可以將Object改成String。
現在就可以將我們自定義的註解作用在我們需要校驗的欄位上了
public class User { @MyConstraint(message = "這是一次測試") private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
編寫我們的Controller進行資料接收
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping
public void create(@Valid @RequestBody User user,BindingResult errors) {
if (errors.hasErrors()) {
errors.getAllErrors().stream().forEach(error -> System.out.println(error.getDefaultMessage()));
}
}
當我們傳入username為tom時,控制檯不列印資訊,當username不是tom時,控制檯打印出message中的資訊,即“這是一次測試”。