SpringBoot使用Validation進(jìn)行參數(shù)校驗的示例詳解
一、引入相應(yīng)的依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
spring-boot-starter-validation本質(zhì)是使用的Hibernate Validator,它并沒有自己的實現(xiàn)。
二、Validation的基本校驗注解
空檢查
- @Null 驗證對象是否為null
- @NotNull 驗證對象是否不為null, 無法查檢長度為0的字符串
- @NotBlank 檢查約束字符串是不是Null還有被Trim的長度是否大于0,只對字符串,且會去掉前后空格.
- @NotEmpty 檢查約束元素是否為NULL或者是EMPTY.
Booelan檢查
- @AssertTrue 驗證 Boolean 對象是否為 true
- @AssertFalse 驗證 Boolean 對象是否為 false
長度檢查
- @Size(min=, max=) 驗證對象(Array,Collection,Map,String)長度是否在給定的范圍之內(nèi)
- @Length(min=, max=) 驗證注解的元素值長度在min和max區(qū)間內(nèi)
日期檢查
- @Past 驗證 Date 和 Calendar 對象是否在當(dāng)前時間之前
- @Future 驗證 Date 和 Calendar 對象是否在當(dāng)前時間之后
- @Pattern 驗證 String 對象是否符合正則表達(dá)式的規(guī)則
數(shù)值檢查,建議使用在Stirng,Integer類型,不建議使用在int類型上,因為表單值為“”時無法轉(zhuǎn)換為int,但可以轉(zhuǎn)換為Stirng為"",Integer為null
@Min 驗證 Number 和 String 對象是否大等于指定的值
@Max 驗證 Number 和 String 對象是否小等于指定的值
@DecimalMax 被標(biāo)注的值必須不大于約束中指定的最大值. 這個約束的參數(shù)是一個通過BigDecimal定義的最大值的字符串表示.小數(shù)存在精度
@DecimalMin 被標(biāo)注的值必須不小于約束中指定的最小值. 這個約束的參數(shù)是一個通過BigDecimal定義的最小值的字符串表示.小數(shù)存在精度
@Digits 驗證 Number 和 String 的構(gòu)成是否合法
@Digits(integer=,fraction=) 驗證字符串是否是符合指定格式的數(shù)字,interger指定整數(shù)精度,fraction指定小數(shù)精度。
@Range(min=, max=) 驗證注解的元素值在最小值和最大值之間
@Range(min=10000,max=50000,message="range.bean.wage")
@Valid 寫在方法參數(shù)前,遞歸的對該對象進(jìn)行校驗, 如果關(guān)聯(lián)對象是個集合或者數(shù)組,那么對其中的元素進(jìn)行遞歸校驗,如果是一個map,則對其中的值部分進(jìn)行校驗.(是否進(jìn)行遞歸驗證)
@CreditCardNumber信用卡驗證
@Email 驗證是否是郵件地址,如果為null,不進(jìn)行驗證,算通過驗證。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)
三、添加參數(shù)校驗
在我們對應(yīng)的DTO上并在controller的上添加校驗。
1.在DTO的屬性上添加校驗
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 = "用戶名不能為空")
private String username;
@NotBlank(message = "密碼不能為空")
@Length(min = 6, max = 20, message = "密碼長度在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;
}
通過在參數(shù)上添加各種校驗注解實現(xiàn)校驗
2.在controller對應(yīng)的DTO添加@Valid或者@Validated
@PostMapping("/registry")
public ResponseResult registryUser(@RequestBody @Valid registryUserDto registryUserDto) {
return ResponseResult.okResult(registryUserDto);
}這樣添加后就可以對其中的參數(shù)實現(xiàn)校驗了,當(dāng)校驗失敗時接口就會返回500異常和相應(yīng)的異常信息。

對于復(fù)雜String校驗我們可以使用正則來校驗,如下所示:
@Pattern(regexp = "^1(3|4|5|7|8)\d{9}$",message = "手機(jī)號碼格式錯誤")
@NotBlank(message = "手機(jī)號碼不能為空")
private String phone;另外對于單個參數(shù)的校驗,沒有用DTO對象來接收的參數(shù)也可以校驗,先在controller類上添加@Validated,再在對應(yīng)的參數(shù)前加校驗注解,如下所示:
@RestController
@RequestMapping("/user")
@Validated
public class UserController {
@PostMapping("/registry")
public ResponseResult registryUser(@NotBlank(message = "name不能為空") String name) {
return ResponseResult.okResult(name);
}
}四、自定義校驗注解
對于一些常見的或復(fù)雜的校驗需要我們需要自定義校驗注解,實現(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.實現(xiàn)相應(yīng)的校驗
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;五、校驗失敗統(tǒng)一異常處理
大家可以看到我們上面校驗失敗的響應(yīng)msg非常不友好,有很多前端不需要知道的消息。
我們基于全局統(tǒng)一異常處理來添加校驗失敗的處理,不太清楚統(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());
}
/* 添加校驗參數(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īng)如下:

可以看到異常信息非常友好,也非常方便前端彈出消息框提示!
這樣就在SpringBoot的項目中添加了參數(shù)校驗及統(tǒng)一異常處理,其實整體非常簡單,也希望大家在項目中用起來!
以上就是SpringBoot使用Validation進(jìn)行參數(shù)校驗的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Validation參數(shù)校驗的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot SSE服務(wù)端主動推送事件的實現(xiàn)
本文主要介紹了SpringBoot SSE服務(wù)端主動推送事件的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Java項目導(dǎo)入IDEA的流程配置以及常見問題解決方法
通常一個團(tuán)隊中可能有人用eclipse,有人用intelliJ,那么經(jīng)常會出現(xiàn)需要導(dǎo)入別人用eclipse建好的web項目,下面這篇文章主要給大家介紹了關(guān)于Java項目導(dǎo)入IDEA的流程配置以及常見問題解決方法的相關(guān)資料,需要的朋友可以參考下2023-05-05
IntelliJ?IDEA?2022.2.1最新永久激活破解教程(持續(xù)更新)
這篇文章主要介紹了IntelliJ?IDEA?2022.2.1最新永久激活破解教程(持續(xù)更新),小編測試這種激活工具也適用idea2022以下所有版本,本篇教程整理的比較詳細(xì),匯總了idea各個版本的激活工具,激活方法多種多樣,大家選擇一種即可,感興趣的朋友跟隨小編一起看看吧2022-09-09
Java字符串格式化Formatter和printf()的使用詳解
這篇文章主要介紹了Java字符串格式化Formatter和printf()的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-05-05

