SpringBoot使用spring-boot-starter-validation實(shí)現(xiàn)參數(shù)校驗(yàn)
前言
在開發(fā) RESTful 接口時(shí),接口參數(shù)校驗(yàn)是保障系統(tǒng)健壯性和安全性的重要一環(huán)。Spring Boot 提供了對(duì) Bean Validation 的開箱即用支持 —— 通過 spring-boot-starter-validation 模塊,我們可以非常方便地使用 JSR-380 標(biāo)準(zhǔn)定義的注解(如 @NotNull、@NotBlank、@Email 等)進(jìn)行參數(shù)校驗(yàn)。
本文將帶你從零開始掌握如何在 Spring Boot 中使用 spring-boot-starter-validation,并通過多個(gè)實(shí)際案例演示其強(qiáng)大功能,包括:
- 單個(gè)參數(shù)校驗(yàn)
- 對(duì)象嵌套校驗(yàn)
- 自定義校驗(yàn)規(guī)則
- 全局異常統(tǒng)一處理
- 多語言錯(cuò)誤信息支持
無論你是初學(xué)者,還是有一定經(jīng)驗(yàn)的開發(fā)者,這篇文章都能讓你寫出更規(guī)范、更健壯的接口!
一、什么是 spring-boot-starter-validation
定義
spring-boot-starter-validation 是 Spring Boot 提供的一個(gè) starter 模塊,它默認(rèn)集成了 Hibernate Validator,實(shí)現(xiàn)了 Java 的 Bean Validation 規(guī)范(JSR-380),可以用于對(duì) Java Bean 的字段進(jìn)行自動(dòng)校驗(yàn)。
特性
| 特性 | 描述 |
|---|---|
| 零配置 | 默認(rèn)集成 Hibernate Validator |
| 注解驅(qū)動(dòng) | 支持 @NotNull, @Size, @Email 等豐富注解 |
| 分組校驗(yàn) | 可以根據(jù)業(yè)務(wù)場景分組驗(yàn)證 |
| 異常統(tǒng)一處理 | 結(jié)合 @ControllerAdvice 統(tǒng)一處理校驗(yàn)失敗 |
| 多語言支持 | 支持國際化錯(cuò)誤提示 |
二、快速入門:引入與使用
Step 1:添加依賴
如果你創(chuàng)建的是一個(gè)標(biāo)準(zhǔn)的 Spring Boot Web 項(xiàng)目,spring-boot-starter-web 已經(jīng)默認(rèn)包含了 spring-boot-starter-validation,無需額外添加。
<!-- 如果你想顯式添加 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Step 2:定義請求對(duì)象并添加校驗(yàn)注解
import javax.validation.constraints.*;
public class UserRequest {
@NotBlank(message = "用戶名不能為空")
private String username;
@Email(message = "郵箱格式不正確")
private String email;
@Min(value = 18, message = "年齡不能小于18歲")
@Max(value = 120, message = "年齡不能大于120歲")
private int age;
// getters and setters...
}
Step 3:在 Controller 中啟用校驗(yàn)
在 Controller 方法中,使用 @Valid 注解開啟校驗(yàn)邏輯,并結(jié)合 @RequestBody 使用。
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public String createUser(@Valid @RequestBody UserRequest request) {
return "用戶提交成功:" + request.toString();
}
}
注意:
@Valid必須寫在方法參數(shù)上;- 如果校驗(yàn)失敗,會(huì)拋出
MethodArgumentNotValidException異常;
三、實(shí)戰(zhàn):全局異常統(tǒng)一處理
為了統(tǒng)一返回錯(cuò)誤信息,我們可以使用 @ControllerAdvice 來捕獲所有校驗(yàn)異常。
示例代碼:
@ControllerAdvice
public class GlobalValidationHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((org.springframework.validation.FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return errors;
}
}
返回示例:
{
"username": "用戶名不能為空",
"email": "郵箱格式不正確"
}
四、高級(jí)用法詳解
1. 嵌套對(duì)象校驗(yàn)
你可以對(duì)嵌套的對(duì)象也進(jìn)行校驗(yàn):
public class AddressRequest {
@NotBlank(message = "地址不能為空")
private String detail;
// getter/setter
}
public class UserRequest {
@NotBlank(message = "用戶名不能為空")
private String username;
@NotNull(message = "地址信息不能為空")
private AddressRequest address;
// getter/setter
}
只要加上 @Valid 注解,Spring 會(huì)自動(dòng)遞歸校驗(yàn)嵌套對(duì)象。
2. 分組校驗(yàn)(Group Validation)
有時(shí)候你希望同一個(gè)對(duì)象在不同接口中使用不同的校驗(yàn)規(guī)則?這時(shí)就可以使用分組校驗(yàn)。
第一步:定義分組接口
public interface OnCreate {}
public interface OnUpdate {}
第二步:在實(shí)體類中指定分組
public class UserRequest {
@NotBlank(groups = OnCreate.class, message = "創(chuàng)建時(shí)用戶名不能為空")
@NotBlank(groups = OnUpdate.class, message = "更新時(shí)用戶名不能為空")
private String username;
@NotBlank(groups = OnCreate.class, message = "郵箱不能為空")
private String email;
}
第三步:在 Controller 中指定分組
@PostMapping("/create")
public String createUser(@Validated(OnCreate.class) @RequestBody UserRequest request) {
return "創(chuàng)建用戶";
}
@PostMapping("/update")
public String updateUser(@Validated(OnUpdate.class) @RequestBody UserRequest request) {
return "更新用戶";
}
注意:此時(shí)必須使用 @Validated 注解(來自 org.springframework.validation.annotation.Validated),而非 @Valid。
3. 自定義校驗(yàn)規(guī)則
當(dāng)內(nèi)置注解不能滿足需求時(shí),可以自定義校驗(yàn)器。
步驟如下:
Step 1:創(chuàng)建注解
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MobileValidator.class)
public @interface Mobile {
String message() default "手機(jī)號(hào)格式不正確";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Step 2:實(shí)現(xiàn)校驗(yàn)器
public class MobileValidator implements ConstraintValidator<Mobile, String> {
private static final String MOBILE_REGEX = "^1[3-9]\\d{9}$";
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value != null && value.matches(MOBILE_REGEX);
}
}
Step 3:使用注解
@Mobile(message = "手機(jī)號(hào)格式錯(cuò)誤") private String mobile;
五、國際化支持(i18n)
你可以為不同語言提供不同的錯(cuò)誤提示信息:
在 messages.properties 文件中定義:
NotBlank.userRequest.username=用戶名不能為空 Mobile.userRequest.mobile=手機(jī)號(hào)格式錯(cuò)誤
再配合 Spring 的 MessageSource 和 LocaleResolver,即可實(shí)現(xiàn)多語言錯(cuò)誤提示。
六、常見問題與解決方案
| 問題 | 解決方案 |
|---|---|
| 校驗(yàn)不生效 | 確保使用 @Valid 或 @Validated |
| 嵌套對(duì)象未校驗(yàn) | 確保子對(duì)象字段也加了注解 |
| 分組無效 | 確保使用 @Validated 并指定分組 |
| 錯(cuò)誤信息亂碼 | 設(shè)置響應(yīng)編碼或使用 JSON 序列化 |
| 無法獲取字段名 | 使用 FieldError 獲取具體字段 |
七、總結(jié)對(duì)比表
| 功能 | 描述 |
|---|---|
| 校驗(yàn)方式 | 注解驅(qū)動(dòng),聲明式校驗(yàn) |
| 異常處理 | @ControllerAdvice 統(tǒng)一處理 |
| 嵌套對(duì)象 | 支持遞歸校驗(yàn) |
| 分組校驗(yàn) | 支持按業(yè)務(wù)場景定制 |
| 自定義規(guī)則 | 支持自定義注解和校驗(yàn)器 |
| 國際化 | 支持多語言提示 |
八、結(jié)語
Spring Boot 提供的 spring-boot-starter-validation 模塊極大簡化了接口參數(shù)校驗(yàn)的開發(fā)流程,使得我們能夠以最小的成本寫出安全、規(guī)范、可維護(hù)性強(qiáng)的接口代碼。
無論是構(gòu)建企業(yè)級(jí)后臺(tái)系統(tǒng),還是搭建高并發(fā) API 平臺(tái),都應(yīng)該合理使用參數(shù)校驗(yàn)來提升系統(tǒng)的穩(wěn)定性與用戶體驗(yàn)。
到此這篇關(guān)于SpringBoot使用spring-boot-starter-validation實(shí)現(xiàn)參數(shù)校驗(yàn)的文章就介紹到這了,更多相關(guān)SpringBoot參數(shù)校驗(yàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot利用Validation包實(shí)現(xiàn)高效參數(shù)校驗(yàn)
- SpringBoot參數(shù)校驗(yàn):@Valid與@Validated使用詳解
- Springboot項(xiàng)目參數(shù)校驗(yàn)方式(Validator)
- SpringBoot中利用@Valid和@Validated進(jìn)行參數(shù)校驗(yàn)
- SpringBoot使用@NotEmpty、@NotBlank、@NotNull注解進(jìn)行參數(shù)校驗(yàn)
- springboot使用@Validated或@Valid注解校驗(yàn)參數(shù)方式
相關(guān)文章
java公眾平臺(tái)通用接口工具類HttpConnectUtil實(shí)例代碼
下面小編就為大家分享一篇java公眾平臺(tái)通用接口工具類HttpConnectUtil實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
SpringBoot加載不出來application.yml文件的解決方法
這篇文章主要介紹了SpringBoot加載不出來application.yml文件的解決方法,文中通過示例代碼講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作有一定的幫助,需要的朋友跟著小編來一起來學(xué)習(xí)吧2023-12-12

