詳解Springboot如何優(yōu)雅的進行數(shù)據(jù)校驗
引入依賴
首先只需要給項目添加上 spring-boot-starter-web 依賴就夠了,它的子依賴包含了我們所需要的東西。

注意: Spring Boot 2.3 1 之后,spring-boot-starter-validation 已經(jīng)不包括在了 spring-boot-starter-web 中,需要我們手動加上!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>驗證 Controller 的輸入
一定一定不要忘記在類上加上 @ Validated 注解了,這個參數(shù)可以告訴 Spring 去校驗方法參數(shù)。
驗證請求體
驗證請求體即使驗證被 @RequestBody 注解標(biāo)記的方法參數(shù)。
PersonController
我們在需要驗證的參數(shù)上加上了@Valid注解,如果驗證失敗,它將拋出MethodArgumentNotValidException。默認情況下,Spring 會將此異常轉(zhuǎn)換為 HTTP Status 400(錯誤請求)。
@RestController
@RequestMapping("/api/person")
@Validated
public class PersonController {
@PostMapping
public ResponseEntity<PersonRequest> save(@RequestBody @Valid PersonRequest personRequest) {
return ResponseEntity.ok().body(personRequest);
}
}@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PersonRequest {
@NotNull(message = "classId 不能為空")
private String classId;
@Size(max = 33)
@NotNull(message = "name 不能為空")
private String name;
@Pattern(regexp = "(^Man$|^Woman$|^UGM$)", message = "sex 值不在可選范圍")
@NotNull(message = "sex 不能為空")
private String sex;
}使用 Postman 驗證

驗證請求參數(shù)
驗證請求參數(shù)(Path Variables 和 Request Parameters)即是驗證被 @PathVariable 以及 @RequestParam 標(biāo)記的方法參數(shù)。
PersonController
@RestController
@RequestMapping("/api/persons")
@Validated
public class PersonController {
@GetMapping("/{id}")
public ResponseEntity<Integer> getPersonByID(@Valid @PathVariable("id") @Max(value = 5, message = "超過 id 的范圍了") Integer id) {
return ResponseEntity.ok().body(id);
}
@PutMapping
public ResponseEntity<String> getPersonByName(@Valid @RequestParam("name") @Size(max = 6, message = "超過 name 的范圍了") String name) {
return ResponseEntity.ok().body(name);
}
}使用 Postman 驗證


嵌套校驗
在一個校驗A對象里另一個B對象里的參數(shù)
需要在B對象上加上@Valid注解


常用校驗注解總結(jié)
JSR303 定義了 Bean Validation(校驗)的標(biāo)準 validation-api,并沒有提供實現(xiàn)。Hibernate Validation是對這個規(guī)范/規(guī)范的實現(xiàn) hibernate-validator,并且增加了 @Email、@Length、@Range 等注解。Spring Validation 底層依賴的就是Hibernate Validation。
JSR 提供的校驗注解:
- @Null 被注釋的元素必須為 null
- @NotNull 被注釋的元素必須不為 null
- @AssertTrue 被注釋的元素必須為 true
- @AssertFalse 被注釋的元素必須為 false
- @Min(value) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
- @Max(value) 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值
- @DecimalMin(value) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
- @DecimalMax(value) 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值
- @Size(max=, min=) 被注釋的元素的大小必須在指定的范圍內(nèi)
- @Digits (integer, fraction) 被注釋的元素必須是一個數(shù)字,其值必須在可接受的范圍內(nèi)
- @Past 被注釋的元素必須是一個過去的日期
- @Future 被注釋的元素必須是一個將來的日期
- @Pattern(regex=,flag=) 被注釋的元素必須符合指定的正則表達式
Hibernate Validator 提供的校驗注解:
- @NotBlank(message =) 驗證字符串非 null,且長度必須大于 0
- @Email 被注釋的元素必須是電子郵箱地址
- @Length(min=,max=) 被注釋的字符串的大小必須在指定的范圍內(nèi)
- @NotEmpty 被注釋的字符串的必須非空
- @Range(min=,max=,message=) 被注釋的元素必須在合適的范圍內(nèi)

@JsonFormat與@DateTimeFormat注解的使用
@JsonFormat用于后端傳給前端的時間格式轉(zhuǎn)換,@DateTimeFormat用于前端傳給后端的時間格式轉(zhuǎn)換
JsonFormat
1、使用maven引入@JsonFormat所需要的jar包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>2、在需要查詢時間的數(shù)據(jù)庫字段對應(yīng)的實體類的屬性上添加@JsonFormat
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateDate;
注: timezone:是時間設(shè)置為東八區(qū),避免時間在轉(zhuǎn)換中有誤差,pattern:是時間轉(zhuǎn)換格式
DataTimeFormat
1、添加依賴
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.3</version>
</dependency>2、我們在對應(yīng)的接收前臺數(shù)據(jù)的對象的屬性上加@DateTimeFormat
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime acquireDate;
3.這樣我們就可以將前端獲取的時間轉(zhuǎn)換為一個符合自定義格式的時間格式存儲到數(shù)據(jù)庫了 全局異常統(tǒng)一處理:攔截并處理校驗出錯的返回數(shù)據(jù) 寫一個全局異常處理類
@ControllerAdvice
public class GlobalExceptionHandler{
/**
* 處理參數(shù)校驗異常
*/
@ExceptionHandler({MethodArgumentNotValidException.class})
@ResponseBody
public ErrorResponseData validateException(MethodArgumentNotValidException e) {
log.error("參數(shù)異常"+e.getBindingResult().getFieldError().getDefaultMessage(),e);
return new ErrorResponseData(10001,e.getBindingResult().getFieldError().getDefaultMessage());
}
/**
* 處理json轉(zhuǎn)換異常(比如 @DateTimeFormat注解轉(zhuǎn)換日期格式時)
*/
@ExceptionHandler({HttpMessageNotReadableException.class})
@ResponseBody
public ErrorResponseData jsonParseException(HttpMessageNotReadableException e) {
log.error("參數(shù)異常"+e.getLocalizedMessage(),e);
return new ErrorResponseData(10001,e.getCause().getMessage());
}
}以上就是詳解Springboot如何優(yōu)雅的進行數(shù)據(jù)校驗的詳細內(nèi)容,更多關(guān)于Springboot 數(shù)據(jù)校驗的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot Event實現(xiàn)異步消費機制的示例代碼
這篇文章主要介紹了SpringBoot Event實現(xiàn)異步消費機制,ApplicationEvent以及Listener是Spring為我們提供的一個事件監(jiān)聽、訂閱的實現(xiàn),內(nèi)部實現(xiàn)原理是觀察者設(shè)計模式,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下2024-04-04
springcloud連接遠程nacos失敗顯示localhost服務(wù)連接失敗的問題解決
這篇文章主要介紹了springcloud連接遠程nacos失敗顯示localhost服務(wù)連接失敗的問題解決,文中有詳細的代碼示例供大家參考,對大家解決問題有一定的幫助,需要的朋友可以參考下2024-03-03
Java畢業(yè)設(shè)計實戰(zhàn)之二手書商城系統(tǒng)的實現(xiàn)
這是一個使用了java+JSP+Springboot+maven+mysql+ThymeLeaf+FTP開發(fā)的二手書商城系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習(xí),具有在線書城該有的所有功能,感興趣的朋友快來看看吧2022-01-01
MyBatis-Plus逆向工程——Generator的使用
這篇文章主要介紹了MyBatis-Plus逆向工程——Generator的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
一文詳解Java應(yīng)用頻繁Full GC的原因與調(diào)優(yōu)方案
在高并發(fā)的交易場景中,Java應(yīng)用的性能穩(wěn)定性直接影響用戶體驗,近期某交易平臺訂單服務(wù)在高峰期頻繁出現(xiàn)Full GC,導(dǎo)致服務(wù)暫停數(shù)秒,給用戶帶來了極差的使用感受,本文將結(jié)合該服務(wù)的實際場景,詳細講解Full GC的常見原因與調(diào)優(yōu)方案,需要的朋友可以參考下2025-09-09
Spring Boot的filter(過濾器)簡單使用實例詳解
過濾器(Filter)的注冊方法和 Servlet 一樣,有兩種方式:代碼注冊或者注解注冊,下面通過實例給大家介紹Spring Boot的filter(過濾器)簡單使用,一起看看吧2017-04-04
MyBatis配置數(shù)據(jù)庫連接并實現(xiàn)交互的操作步驟
這篇文章主要介紹了MyBatis配置數(shù)據(jù)庫連接并實現(xiàn)交互的操作步驟,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧2025-04-04

