前言
最近為了工作也為了更加深入了解掌握java注解的使用,決定自定義注解來實現數據驗證。
API開發中經常會遇到一些對請求數據進行驗證的情況,這時候如果使用注解就有兩個好處,一是驗證邏輯和業務邏輯分離,代碼清晰,二是驗證邏輯可以輕松復用,只需要在要驗證的地方加上注解就可以。
Java提供了一些基本的驗證注解,比如@NotNull、@Size,但是更多情況下需要自定義驗證邏輯,這時候就可以自己實現一個驗證注解,方法很簡單,僅需要兩個東西:
自定義驗證注解
考慮有一個API,接收一個Student對象,并希望對象里的age域的值是奇數,這時候就可以創建以下注解:
@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = AgeValidator.class)public @interface Odd {String message() default "Age Must Be Odd";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}
其中:
創建驗證器
有了注解之后,就需要一個驗證器來實現驗證邏輯:
public class AgeValidator implements ConstraintValidator<Odd,Integer> {@Overridepublic void initialize(Odd constraintAnnotation) {}@Overridepublic boolean isValid(Integer age, ConstraintValidatorContext constraintValidatorContext) {return age % 2 != 0;}}
其中:
應用注解
注解和驗證器創建好之后,就可以使用注解了:
public class Student {@Oddprivate int age;private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
@RestControllerpublic class StudentResource {@PostMapping("/student")public String addStudent(@Valid @RequestBody Student student) {return "Student Created";}}
在需要啟用驗證的地方加上@Valid注解,這時候如果請求里的Student年齡不是奇數,就會得到一個400響應:
{"timestamp": "2018-08-15T17:01:44.598+0000","status": 400,"error": "Bad Request","errors": [{"codes": ["Odd.student.age","Odd.age","Odd.int","Odd"],"arguments": [{"codes": ["student.age","age"],"arguments": null,"defaultMessage": "age","code": "age"}],"defaultMessage": "Age Must Be Odd","objectName": "student","field": "age","rejectedValue": 12,"bindingFailure": false,"code": "Odd"}],"message": "Validation failed for object='student'. Error count: 1","path": "/student"}
也可以手動來處理錯誤,加上一個BindingResult來接收驗證結果即可:
@RestControllerpublic class StudentResource {@PostMapping("/student")public String addStudent(@Valid @RequestBody Student student, BindingResult validateResult) {if (validateResult.hasErrors()) {return validateResult.getAllErrors().get(0).getDefaultMessage();}return "Student Created";}}
這時候如果驗證出錯,便只會返回一個狀態為200,內容為Age Must Be Odd的響應。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。
新聞熱點
疑難解答
圖片精選