您好,登錄后才能下訂單哦!
這篇文章主要講解了SpringBoot中參數(shù)校驗(yàn)的用法,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
Java后端發(fā)工作中經(jīng)常會(huì)對(duì)前端傳遞過來的參數(shù)做一些校驗(yàn),在業(yè)務(wù)中還要拋出異?;蛘卟粩嗟姆祷禺惓r(shí)的校驗(yàn)信息,充滿了if-else這種校驗(yàn)代碼,在代碼中相當(dāng)冗長。例如說,用戶注冊(cè)時(shí),會(huì)校驗(yàn)手機(jī)格式的正確性,用戶名的長度等等。雖說前端也可以做參數(shù)校驗(yàn),但是為了保證我們API接口的可靠性,以保證最終數(shù)據(jù)入庫的正確性,后端進(jìn)行參數(shù)校驗(yàn)不可忽視。 Hibernate Validator
提供了一種統(tǒng)一方便的方式,讓我們快速的實(shí)現(xiàn)參數(shù)校驗(yàn)。
Hibernate Validator
使用注解,實(shí)現(xiàn)聲明式校驗(yàn)。而在實(shí)現(xiàn)原理上,也是基于 Spring AOP 攔截,實(shí)現(xiàn)校驗(yàn)相關(guān)的操作。 javax.validation.constraints
包下,定義了一系列的約束( constraint )注解。文末會(huì)貼上一些常用的注解。 如果項(xiàng)目的框架是 spring boot 的話,在 spring-boot-starter-web
中已經(jīng)包含了 Hibernate-validator
的依賴( 版本<2.3 )。 2.3
以后的版本中 spring-boot-starter-web
已經(jīng)去除了這個(gè)依賴,需要手動(dòng)引入 Hibernate-validator
依賴,并且有一些變化,因此 2.3.x 的版本暫不研究。本文使用的版本是 2.2.8
。
實(shí)戰(zhàn)
1、創(chuàng)建實(shí)體類
package com.yese.pojo; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor public class User { /** * 用戶ID */ @NotNull(message = "用戶id不能為空") private Long userId; /** * 用戶名 */ @NotBlank(message = "用戶名不能為空") @Length(max = 20, message = "用戶名不能超過10個(gè)字符") @Pattern(regexp = "^[\\u4E00-\\u9FA5A-Za-z0-9\\*]*$", message = "用戶名限制:最多10字符,包含文字、字母和數(shù)字") private String username; /** * 密碼 */ @NotBlank(message = "密碼不能為空") private String password; /** * 手機(jī)號(hào) */ @NotBlank(message = "手機(jī)號(hào)不能為空") @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手機(jī)號(hào)格式有誤") private String mobile; /** * 性別 */ @NotNull(message = "性別不能為空") private Integer sex; /** * 年齡 */ @NotNull(message = "年齡不能為空") @Min(value = 1, message = "年齡最小為1歲") @Max(value = 120, message = "年齡最大為120歲") private Integer age; /** * 郵箱 */ @NotBlank(message = "郵箱不能為空") @Email(message = "郵箱格式錯(cuò)誤") private String email; }
2、創(chuàng)建controller
package com.yese.controller; import com.yese.pojo.User; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController @Slf4j public class UserController { /** * controller方法的入?yún)⒗锩嬖趯?shí)體類前面加上@Validated */ @PostMapping("/user") public void add(@RequestBody @Validated User user) { log.info("user====={}", user); } }
3、創(chuàng)建全局異常處理器
package com.yese.config; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.validation.ConstraintViolationException; import java.util.HashMap; import java.util.Map; import java.util.StringJoiner; /** * 全局異常處理器 */ @RestControllerAdvice public class GlobalExceptionHandler { /** * post方式提交json數(shù)據(jù),參數(shù)校驗(yàn)失敗后,會(huì)拋出一個(gè)MethodArgumentNotValidException */ @ExceptionHandler(MethodArgumentNotValidException.class) public Map<String, Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { // 獲取所有的錯(cuò)誤 // List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors(); // 獲取錯(cuò)誤提示 // System.out.println(fieldErrors.get(0).getDefaultMessage()); // 獲取錯(cuò)誤字段 // System.out.println(fieldErrors.get(0).getField()); // 將所有的錯(cuò)誤提示使用";"拼接起來并返回 StringJoiner sj = new StringJoiner(";"); e.getBindingResult().getFieldErrors().forEach(x -> sj.add(x.getDefaultMessage())); // 此處通常定義一個(gè)全局相應(yīng)對(duì)象返回 Map<String, Object> map = new HashMap<>(); // 此處狀態(tài)碼可以通過枚舉或者常量定義 map.put("code", 1001); map.put("msg", sj.toString()); return map; } /** * get方式提交參數(shù),參數(shù)校驗(yàn)失敗后,會(huì)拋出一個(gè)ConstraintViolationException */ @ExceptionHandler(ConstraintViolationException.class) public Map<String, Object> handleConstraintViolationException(ConstraintViolationException e) { StringJoiner sj = new StringJoiner(";"); e.getConstraintViolations().forEach(x -> sj.add(x.getMessage())); Map<String, Object> map = new HashMap<>(); map.put("code", 1001); map.put("msg", sj.toString()); return map; } }
4、測試
效果符合預(yù)期!
@Valid和@Validated
絕大多數(shù)場景下,我們使用 @Validated 注解即可。
而在有嵌套校驗(yàn)的場景,我們使用 @Valid 注解添加到成員屬性上。
附常用注解
javax.validation.constraints
包下
注解 | 驗(yàn)證的數(shù)據(jù)類型 | 說明 |
---|---|---|
@Null | 任意類型 | 驗(yàn)證注解的元素值必須是null |
@NotNull | 任意類型 | 驗(yàn)證注解的元素值不是null |
@NotBlank | 字符串 | 驗(yàn)證注解的元素值不為空(不為null、去除首位空格后長度大于0) |
@NotEmpty | CharSequence子類型、Collection、Map、數(shù)組 | 驗(yàn)證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0) |
@Min(value=值) | 數(shù)值類型 | 驗(yàn)證注解的元素值大于等于@Min指定的value值 |
@Max(value=值) | 和@Min要求一樣 | 驗(yàn)證注解的元素值小于等于@Max指定的value值 |
@DecimalMin(value=值) | 和@Min要求一樣 | 驗(yàn)證注解的元素值大于等于@ DecimalMin指定的value值 |
@DecimalMax(value=值) | 和@Min要求一樣 | 驗(yàn)證注解的元素值小于等于@ DecimalMax指定的value值 |
@Digits(integer=整數(shù)位數(shù), fraction=小數(shù)位數(shù)) | 和@Min要求一樣 | 驗(yàn)證注解的元素值的整數(shù)位數(shù)和小數(shù)位數(shù)上限 |
@Size(min=下限, max=上限) | 字符串、Collection、Map、數(shù)組等 | 驗(yàn)證注解的元素值的在min和max(包含)指定區(qū)間之內(nèi),如字符長度、集合大小 |
@Positive | 判斷正數(shù) | |
@PositiveOrZero | 判斷正數(shù)或 0 。 | |
@Negative | 判斷負(fù)數(shù)。 | |
@NegativeOrZero | 判斷負(fù)數(shù)或 0 。 | |
@Past | 日期類型 | 驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間早 |
@Future | 與@Past要求一樣 | 驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間晚 |
@AssertFalse | Boolean | 驗(yàn)證注解的元素值是false |
@AssertTrue | Boolean | 驗(yàn)證注解的元素值是true |
@Range(min=最小值, max=最大值) | BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子類型和包裝類型 | 驗(yàn)證注解的元素值在最小值和最大值之間 |
字符串 | 驗(yàn)證注解的元素值是Email,也可以通過regexp和flag指定自定義的email格式 | |
@Pattern(regexp=正則表達(dá)式,flag=標(biāo)志的模式) | 字符串 | 驗(yàn)證注解的元素值與指定的正則表達(dá)式匹配 |
@Valid | 任何非原子類型 | 指定遞歸驗(yàn)證關(guān)聯(lián)的對(duì)象如用戶對(duì)象中有個(gè)地址對(duì)象屬性,如果想在驗(yàn)證用戶對(duì)象時(shí)一起驗(yàn)證地址對(duì)象的話,在地址對(duì)象上加@Valid注解即可級(jí)聯(lián)驗(yàn)證 |
org.hibernate.validator.constraints
包下,定義了一系列的約束( constraint )注解。如下:
@Range(min=, max=)
:被注釋的元素必須在合適的范圍內(nèi)。
@Length(min=, max=)
:被注釋的字符串的大小必須在指定的范圍內(nèi)。
@URL(protocol=,host=,port=,regexp=,flags=)
:被注釋的字符串必須是一個(gè)有效的 URL 。
@SafeHtml
:判斷提交的 HTML 是否安全。例如說,不能包含 javascript 腳本等等。
看完上述內(nèi)容,是不是對(duì)SpringBoot中參數(shù)校驗(yàn)的用法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。