SpringBoot使用Validation進(jìn)行參數(shù)校驗(yàn)的示例詳解
一、引入相應(yīng)的依賴(lài)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
spring-boot-starter-validation
本質(zhì)是使用的Hibernate Validator
,它并沒(méi)有自己的實(shí)現(xiàn)。
二、Validation的基本校驗(yàn)注解
空檢查
- @Null 驗(yàn)證對(duì)象是否為null
- @NotNull 驗(yàn)證對(duì)象是否不為null, 無(wú)法查檢長(zhǎng)度為0的字符串
- @NotBlank 檢查約束字符串是不是Null還有被Trim的長(zhǎng)度是否大于0,只對(duì)字符串,且會(huì)去掉前后空格.
- @NotEmpty 檢查約束元素是否為NULL或者是EMPTY.
Booelan檢查
- @AssertTrue 驗(yàn)證 Boolean 對(duì)象是否為 true
- @AssertFalse 驗(yàn)證 Boolean 對(duì)象是否為 false
長(zhǎng)度檢查
- @Size(min=, max=) 驗(yàn)證對(duì)象(Array,Collection,Map,String)長(zhǎng)度是否在給定的范圍之內(nèi)
- @Length(min=, max=) 驗(yàn)證注解的元素值長(zhǎng)度在min和max區(qū)間內(nèi)
日期檢查
- @Past 驗(yàn)證 Date 和 Calendar 對(duì)象是否在當(dāng)前時(shí)間之前
- @Future 驗(yàn)證 Date 和 Calendar 對(duì)象是否在當(dāng)前時(shí)間之后
- @Pattern 驗(yàn)證 String 對(duì)象是否符合正則表達(dá)式的規(guī)則
數(shù)值檢查,建議使用在Stirng,Integer類(lèi)型,不建議使用在int類(lèi)型上,因?yàn)楸韱沃禐?ldquo;”時(shí)無(wú)法轉(zhuǎn)換為int,但可以轉(zhuǎn)換為Stirng為"",Integer為null
@Min 驗(yàn)證 Number 和 String 對(duì)象是否大等于指定的值
@Max 驗(yàn)證 Number 和 String 對(duì)象是否小等于指定的值
@DecimalMax 被標(biāo)注的值必須不大于約束中指定的最大值. 這個(gè)約束的參數(shù)是一個(gè)通過(guò)BigDecimal定義的最大值的字符串表示.小數(shù)存在精度
@DecimalMin 被標(biāo)注的值必須不小于約束中指定的最小值. 這個(gè)約束的參數(shù)是一個(gè)通過(guò)BigDecimal定義的最小值的字符串表示.小數(shù)存在精度
@Digits 驗(yàn)證 Number 和 String 的構(gòu)成是否合法
@Digits(integer=,fraction=) 驗(yàn)證字符串是否是符合指定格式的數(shù)字,interger指定整數(shù)精度,fraction指定小數(shù)精度。
@Range(min=, max=) 驗(yàn)證注解的元素值在最小值和最大值之間
@Range(min=10000,max=50000,message="range.bean.wage")
@Valid 寫(xiě)在方法參數(shù)前,遞歸的對(duì)該對(duì)象進(jìn)行校驗(yàn), 如果關(guān)聯(lián)對(duì)象是個(gè)集合或者數(shù)組,那么對(duì)其中的元素進(jìn)行遞歸校驗(yàn),如果是一個(gè)map,則對(duì)其中的值部分進(jìn)行校驗(yàn).(是否進(jìn)行遞歸驗(yàn)證)
@CreditCardNumber信用卡驗(yàn)證
@Email 驗(yàn)證是否是郵件地址,如果為null,不進(jìn)行驗(yàn)證,算通過(guò)驗(yàn)證。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)
三、添加參數(shù)校驗(yàn)
在我們對(duì)應(yīng)的DTO
上并在controller
的上添加校驗(yàn)。
1.在DTO
的屬性上添加校驗(yàn)
import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.Email; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import java.util.UUID; @Data @AllArgsConstructor @NoArgsConstructor public class registryUserDto { @NotBlank(message = "用戶(hù)名不能為空") private String username; @NotBlank(message = "密碼不能為空") @Length(min = 6, max = 20, message = "密碼長(zhǎng)度在6-20之間") private String password; @Min(value = 0, message = "年齡最小為0") @Max(value = 200, message = "年齡最大為200") private Integer age; @NotBlank(message = "郵箱不能為空") @Email(message = "郵箱格式不正確") private String email; @JsonIgnore private String salt = UUID.randomUUID().toString().replaceAll("-", ""); private Boolean admin; }
通過(guò)在參數(shù)上添加各種校驗(yàn)注解實(shí)現(xiàn)校驗(yàn)
2.在controller
對(duì)應(yīng)的DTO
添加@Valid
或者@Validated
@PostMapping("/registry") public ResponseResult registryUser(@RequestBody @Valid registryUserDto registryUserDto) { return ResponseResult.okResult(registryUserDto); }
這樣添加后就可以對(duì)其中的參數(shù)實(shí)現(xiàn)校驗(yàn)了,當(dāng)校驗(yàn)失敗時(shí)接口就會(huì)返回500異常和相應(yīng)的異常信息。
對(duì)于復(fù)雜String校驗(yàn)我們可以使用正則來(lái)校驗(yàn),如下所示:
@Pattern(regexp = "^1(3|4|5|7|8)\d{9}$",message = "手機(jī)號(hào)碼格式錯(cuò)誤") @NotBlank(message = "手機(jī)號(hào)碼不能為空") private String phone;
另外對(duì)于單個(gè)參數(shù)的校驗(yàn),沒(méi)有用DTO對(duì)象
來(lái)接收的參數(shù)也可以校驗(yàn),先在controller
類(lèi)上添加@Validated
,再在對(duì)應(yīng)的參數(shù)前加校驗(yàn)注解
,如下所示:
@RestController @RequestMapping("/user") @Validated public class UserController { @PostMapping("/registry") public ResponseResult registryUser(@NotBlank(message = "name不能為空") String name) { return ResponseResult.okResult(name); } }
四、自定義校驗(yàn)注解
對(duì)于一些常見(jiàn)的或復(fù)雜的校驗(yàn)需要我們需要自定義校驗(yàn)注解,實(shí)現(xiàn)如下:
1.新建自定義注解
annotation.validator.Status
:
import com.jk.validator.StatusValidator; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Target({ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = {StatusValidator.class}) public @interface Status { String[] statusType() default {}; String message() default "狀態(tài)傳遞有誤"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
2.實(shí)現(xiàn)相應(yīng)的校驗(yàn)
import com.jk.annotation.validator.Status; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.Arrays; import java.util.List; public class StatusValidator implements ConstraintValidator<Status, Integer> { private List<String> typeStatus ; @Override public void initialize(Status constraintAnnotation) { typeStatus = Arrays.asList(constraintAnnotation.statusType()); ConstraintValidator.super.initialize(constraintAnnotation); } @Override public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) { if(value !=null){ if(!typeStatus.contains(String.valueOf(value))){ return false; } } return true; } }
3.自定義注解的使用
@Status(statusType = {"1", "2"}) private Integer status;
五、校驗(yàn)失敗統(tǒng)一異常處理
大家可以看到我們上面校驗(yàn)失敗的響應(yīng)msg
非常不友好,有很多前端不需要知道的消息。
我們基于全局統(tǒng)一異常處理來(lái)添加校驗(yàn)失敗的處理,不太清楚統(tǒng)一異常處理的可以看我另一篇文章SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理
在統(tǒng)一異常處理中添加BindException
的處理
exception.GlobalExceptionHandler
:
import com.jk.enums.AppHttpCodeEnum; import com.jk.exception.SystemException; import com.jk.domain.vo.ResponseResult; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.BindException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice @Slf4j public class GlobalExceptionHandler { @ExceptionHandler(SystemException.class) public ResponseResult systemExceptionHandler(SystemException e) { log.error("出現(xiàn)了異常! {}", e); return ResponseResult.errorResult(e.getCode(), e.getMsg()); } @ExceptionHandler(Exception.class) public ResponseResult exceptionHandler(Exception e) { log.error("出現(xiàn)了異常! {}", e); return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR.getCode(), e.getMessage()); } /* 添加校驗(yàn)參數(shù)異常處理 */ @ExceptionHandler(BindException.class) public ResponseResult bindExceptionHandler(BindException e) { log.error("出現(xiàn)了異常! {}", e); return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); } }
校驗(yàn)失敗時(shí)前端接收的到的響應(yīng)如下:
可以看到異常信息非常友好,也非常方便前端彈出消息框提示!
這樣就在SpringBoot的項(xiàng)目中添加了參數(shù)校驗(yàn)及統(tǒng)一異常處理,其實(shí)整體非常簡(jiǎn)單,也希望大家在項(xiàng)目中用起來(lái)!
以上就是SpringBoot使用Validation進(jìn)行參數(shù)校驗(yàn)的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Validation參數(shù)校驗(yàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- spring?參數(shù)校驗(yàn)Validation示例詳解
- SpringBoot使用validation進(jìn)行自參數(shù)校驗(yàn)的方法
- Spring?Boot集成validation實(shí)現(xiàn)參數(shù)校驗(yàn)功能
- SpringBoot使用Validation包進(jìn)行輸入?yún)?shù)校驗(yàn)
- springboot之Validation參數(shù)校驗(yàn)詳細(xì)解讀
- SpringBoot集成Validation參數(shù)校驗(yàn)
- 基于Spring Validation實(shí)現(xiàn)全局參數(shù)校驗(yàn)異常處理的示例詳解
相關(guān)文章
詳解基于Mybatis-plus多租戶(hù)實(shí)現(xiàn)方案
這篇文章主要介紹了詳解基于Mybatis-plus多租戶(hù)實(shí)現(xiàn)方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04SpringBoot SSE服務(wù)端主動(dòng)推送事件的實(shí)現(xiàn)
本文主要介紹了SpringBoot SSE服務(wù)端主動(dòng)推送事件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Java項(xiàng)目導(dǎo)入IDEA的流程配置以及常見(jiàn)問(wèn)題解決方法
通常一個(gè)團(tuán)隊(duì)中可能有人用eclipse,有人用intelliJ,那么經(jīng)常會(huì)出現(xiàn)需要導(dǎo)入別人用eclipse建好的web項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于Java項(xiàng)目導(dǎo)入IDEA的流程配置以及常見(jiàn)問(wèn)題解決方法的相關(guān)資料,需要的朋友可以參考下2023-05-05簡(jiǎn)單談?wù)凧ava 中的線(xiàn)程的幾種狀態(tài)
這篇文章主要介紹了簡(jiǎn)單談?wù)凧ava 中的線(xiàn)程的幾種狀態(tài)的相關(guān)資料,需要的朋友可以參考下2020-02-02IntelliJ?IDEA?2022.2.1最新永久激活破解教程(持續(xù)更新)
這篇文章主要介紹了IntelliJ?IDEA?2022.2.1最新永久激活破解教程(持續(xù)更新),小編測(cè)試這種激活工具也適用idea2022以下所有版本,本篇教程整理的比較詳細(xì),匯總了idea各個(gè)版本的激活工具,激活方法多種多樣,大家選擇一種即可,感興趣的朋友跟隨小編一起看看吧2022-09-09Java字符串格式化Formatter和printf()的使用詳解
這篇文章主要介紹了Java字符串格式化Formatter和printf()的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05