麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > Java > 正文

JAVA中通過自定義注解進行數據驗證的方法

2024-07-14 08:42:02
字體:
來源:轉載
供稿:網友

前言

最近為了工作也為了更加深入了解掌握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 {};}

其中:

  • @Target指明這個注解要作用在什么地方,可以是對象、域、構造器等,因為要作用在age域上,因此這里選擇FIELD
  • @Retention指明了注解的生命周期,可以有SOURCE(僅保存在源碼中,會被編譯器丟棄),CLASS(在class文件中可用,會被VM丟棄)以及RUNTIME(在運行期也被保留),這里選擇了生命周期最長的RUNTIME
  • @Constraint是最關鍵的,它表示這個注解是一個驗證注解,并且指定了一個實現驗證邏輯的驗證器
  • message()指明了驗證失敗后返回的消息,此方法為@Constraint要求
  • groups()和payload()也為@Constraint要求,可默認為空,詳細用途可以查看@Constraint文檔

創建驗證器

有了注解之后,就需要一個驗證器來實現驗證邏輯:

public class AgeValidator implements ConstraintValidator<Odd,Integer> {@Overridepublic void initialize(Odd constraintAnnotation) {}@Overridepublic boolean isValid(Integer age, ConstraintValidatorContext constraintValidatorContext) {return age % 2 != 0;}}

其中:

  • 驗證器有兩個類型參數,第一個是所屬的注解,第二個是注解作用地方的類型,這里因為作用在age上,因此這里用了Integer
  • initialize()可以在驗證開始前調用注解里的方法,從而獲取到一些注解里的參數,這里用不到
  • isValid()就是判斷是否合法的地方

應用注解

注解和驗證器創建好之后,就可以使用注解了:

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武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黄色片网站免费观看 | 宅男噜噜噜66国产免费观看 | 欧美日韩免费一区 | av免费在线观看免费 | 福利在线国产 | 久久亚洲第一 | a级在线 | 成人男女啪啪免费观看网站四虎 | 一级做a爱片性色毛片 | 91精选视频| 欧美国产免费 | 作爱在线观看 | 中文字幕在线网站 | 请播放一级毛片 | 国产午夜免费福利 | 欧美成年私人网站 | 黑人一区二区三区四区五区 | 日韩字幕在线观看 | 国产一区二区不卡 | 中文字幕一区二区三区久久 | 国产精品色在线网站 | 日韩黄色在线播放 | 久久久在线免费观看 | 久久久入口| 国产精品片一区二区三区 | 欧美一区二区三区不卡免费观看 | 国产精品一品二区三区四区18 | 污片在线观看视频 | 成人毛片100部免费观看 | 日韩在线欧美在线 | 日韩毛片网 | 久久区二区 | 久久综合久久精品 | h视频免费观看 | 国产日韩亚洲 | 亚洲欧美aⅴ| 欧美大电影免费观看 | 成人影片在线免费观看 | 国产精品一区自拍 | 日韩欧美电影一区二区三区 | v11av在线视频成人 |