javascript
bean validation校验方法参数_Spring Boot 之使用 validation 验证参数
前言
文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/bin392328206/six-finger種一棵樹最好的時間是十年前,其次是現在
我知道很多人不玩qq了,但是懷舊一下,歡迎加入六脈神劍Java菜鳥學習群,群聊號碼:549684836 鼓勵大家在技術的路上寫博客
絮叨
這個東西應該是我們擼業務最常用的組件之一了,因為之前小六六也是自己就是照著用,也沒說全面的去了解一下這塊,今天小六六就帶大家一起來梳理梳理哈。
JSR-303 簡介
JSR-303 是 JavaEE 6 中的一項子規范,叫做 Bean Validation,官方參考實現是 Hibernate Validator。此實現與 Hibernate ORM 沒有任何關系。JSR-303 用于對 Java Bean 中的字段的值進行驗證。Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中使用注解的方式對表單提交的數據方便地驗證。Spring 4.0 開始支持 Bean Validation 功能。JSR-303 基本的校驗規則
空檢查
- @Null 驗證對象是否為 null
- @NotNull 驗證對象是否不為 null, 無法查檢長度為 0 的字符串
- @NotBlank 檢查約束字符串是不是 Null 還有被 Trim 的長度是否大于 0,只對字符串,且會去掉前后空格
- @NotEmpty 檢查約束元素是否為 NULL 或者是 EMPTY
布爾檢查
- @AssertTrue 驗證 Boolean 對象是否為 true
- @AssertFalse 驗證 Boolean 對象是否為 false
長度檢查
@Size(min=, max=) 驗證對象(Array, Collection , Map, String)長度是否在給定的范圍之內 @Length(min=, max=) 驗證字符串長度介于 min 和 max 之間
日期檢查
- @Past 驗證 Date 和 Calendar 對象是否在當前時間之前,驗證成立的話被注釋的元素一定是一個過去的日期
- @Future 驗證 Date 和 Calendar 對象是否在當前時間之后 ,驗證成立的話被注釋的元素一定是一個將來的日期
正則檢查
@Pattern 驗證 String 對象是否符合正則表達式的規則,被注釋的元素符合制定的正則表達式 - regexp:正則表達式 - flags:指定 Pattern.Flag 的數組,表示正則表達式的相關選項
數值檢查
注意:建議使用在 String ,Integer 類型,不建議使用在 int 類型上,因為表單值為 “” 時無法轉換為 int,但可以轉換為 String 為 “”,Integer 為 null
- @Min 驗證 Number 和 String 對象是否大等于指定的值
- @Max 驗證 Number 和 String 對象是否小等于指定的值
- @DecimalMax 被標注的值必須不大于約束中指定的最大值. 這個約束的參數是一個通過 BigDecimal定義的最大值的字符串表示 .小數 存在精度
- @DecimalMin 被標注的值必須不小于約束中指定的最小值. 這個約束的參數是一個通過 BigDecimal定義的最小值的字符串表示 .小數 存在精度
- @Digits 驗證 Number 和 String 的構成是否合法
- @Digits(integer=,fraction=) 驗證字符串是否是符合指定格式的數字,integer 指定整數精度,fraction 指定小數精度
- @Range(min=, max=) 被指定的元素必須在合適的范圍內
- @Range(min=10000,max=50000,message=”range.bean.wage”)
- @Valid 遞歸的對關聯對象進行校驗, 如果關聯對象是個集合或者數組,那么對其中的元素進行遞歸校驗,如果是一個 map,則對其中的值部分進行校驗.(是否進行遞歸驗證)
- @CreditCardNumber 信用卡驗證
- @Email 驗證是否是郵件地址,如果為 null,不進行驗證,算通過驗證
- @ScriptAssert(lang= ,script=, alias=)
- @URL(protocol=,host=, port=,regexp=, flags=)
使用
至于使用的話,小六六這邊就不一一的舉例了,相信大家應該都會,可能平時沒有那么詳細的了解過,所以這次我就是好好給大家復習一下哈哈
@Datapublic?class?User?{
?
?/**?id?*/
?@NotNull(message="id不能為空")
?private?Long?id;
?
?/**?姓名?*/
?@NotBlank(message="姓名不能為空")
?private?String?name;
?
?/**?年齡?*/
?@NotNull(message="年齡不能為空")
?@Max(message="年齡不能超過120歲",?value?=?120)
?@Min(message="年齡不能小于1歲",?value?=?1)
?private?Integer?age;
?
?/**?創建時間?*/
?@Future
?private?Date?createTime;
}
?
然后在controller層里,使用@Valid就好了
?/**??*?校驗不通過時直接拋異常
??*?@param?user
??*?@return
??*/
?@PostMapping("/test1")
?public?Object?test1(@RequestBody?@Valid?User?user)?{
??return?"操作成功!";
?}
Spring Validation的3種執行校驗方式
第一種:在Controller方法參數前加@Valid注解——校驗不通過時直接拋異常
調用時會拋出一個org.springframework.web.bind.MethodArgumentNotValidException異常:
2019-04-21?11:35:28.600??WARN?10852?---?[nio-8080-exec-4]?.w.s.m.s.DefaultHandlerExceptionResolver?:?Resolved?[org.springframework.web.bind.MethodArgumentNotValidException:?Validation?failed?for?argument?[0]?in?public?java.lang.Object?com.example.validation.UserController.test1(com.example.validation.User)?with?3?errors:?[Field?error?in?object?'user'?on?field?'createTime':?rejected?value?[Mon?Dec?31?08:00:00?CST?2018];?codes?[Future.user.createTime,Future.createTime,Future.java.util.Date,Future];?arguments?[org.springframework.context.support.DefaultMessageSourceResolvable:?codes?[user.createTime,createTime];?arguments?[];?default?message?[createTime]];?default?message?[需要是一個將來的時間]]?[Field?error?in?object?'user'?on?field?'age':?rejected?value?[0];?codes?[Min.user.age,Min.age,Min.java.lang.Integer,Min];?arguments?[org.springframework.context.support.DefaultMessageSourceResolvable:?codes?[user.age,age];?arguments?[];?default?message?[age],1];?default?message?[年齡不能小于1歲]]?[Field?error?in?object?'user'?on?field?'name':?rejected?value?[];?codes?[NotBlank.user.name,NotBlank.name,NotBlank.java.lang.String,NotBlank];?arguments?[org.springframework.context.support.DefaultMessageSourceResolvable:?codes?[user.name,name];?arguments?[];?default?message?[name]];?default?message?[姓名不能為空]]?]其實像這種,我想大家肯定是要配合全局統一異常來處理,其實還是很好,目前我就是這么干的。推薦指數 3星
第二種:在Controller方法參數前加@Valid注解,參數后面定義一個BindingResult類型參數——執行時會將校驗結果放進bindingResult里面,用戶自行判斷并處理
???/**??*?將校驗結果放進BindingResult里面,用戶自行判斷并處理
??*?@param?user
??*?@param?bindingResult
??*?@return
??*/
?@PostMapping("/test2")
?public?Object?test2(@RequestBody?@Valid?User?user,?BindingResult?bindingResult)?{
??//?參數校驗
??if?(bindingResult.hasErrors())?{
???String?messages?=?bindingResult.getAllErrors()
????.stream()
????.map(ObjectError::getDefaultMessage)
????.reduce((m1,?m2)?->?m1?+?";"?+?m2)
????.orElse("參數輸入有誤!");
???throw?new?IllegalArgumentException(messages);
??}
??
??return?"操作成功!";
把結果封裝到一個BindingResult中,然后再通過自己去封裝要拋出的信息,這種做法也可以,就是每個controller都要寫,不那么適用,推薦指數 2星
第三種:用戶手動調用對應API執行校驗——Validation.buildDefault ValidatorFactory().getValidator().validate(xxx)
???/**??*?用戶手動調用對應API執行校驗
??*?@param?user
??*?@return
??*/
?@PostMapping("/test3")
?public?Object?test3(@RequestBody?User?user)?{
??//?參數校驗
??validate(user);
??
??return?"操作成功!";
?}
?
?private?void?validate(@Valid?User?user)?{
??Set>?validateSet?=?Validation.buildDefaultValidatorFactory()
????.getValidator()
????.validate(user,?new?Class[0]);if?(!CollectionUtils.isEmpty(validateSet))?{
????String?messages?=?validateSet.stream()
?????.map(ConstraintViolation::getMessage)
?????.reduce((m1,?m2)?->?m1?+?";"?+?m2)
?????.orElse("參數輸入有誤!");
????throw?new?IllegalArgumentException(messages);
???}
}
這種其實原理也差不多,但是看起來也是一樣,沒有那么優雅,推薦指數 2星
結尾
其實這三種用法的原理都是一樣的,只是使用的形式不一樣了,其實看你自己把,哈哈。
參考
- JSR
日常求贊
好了各位,以上就是這篇文章的全部內容了,能看到這里的人呀,都是真粉。
創作不易,各位的支持和認可,就是我創作的最大動力,我們下篇文章見
六脈神劍 | 文 【原創】如果本篇博客有任何錯誤,請批評指教,不勝感激 !
總結
以上是生活随笔為你收集整理的bean validation校验方法参数_Spring Boot 之使用 validation 验证参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c写成php的扩展_用C语言编写PHP扩
- 下一篇: linux server.xml日志参数