一 、【Boot 3 整合 Validation】
在 Spring Boot 应用开发中,请求参数校验是保障数据合法性的重要环节。本文将详细介绍如何在 Spring Boot 3 项目中整合 Validation 框架,包括依赖配置、注解使用、全局异常处理及自定义校验规则等内容,帮助开发者快速实现健壮的数据校验功能。
1. 添加依赖
Spring Boot 3 对 Validation 的支持与 Spring Boot 2 有所不同,主要体现在依赖和底层实现上:
- Spring Boot 3 基于 Jakarta EE 9+,使用jakarta.validation包而非javax.validation
- 依然默认使用 Hibernate Validator 作为实现,但版本要求更高(通常为 8.x 及以上)
首先需要在pom.xml中添加 Validation 相关依赖:
<!-- Spring Boot Validation starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
该依赖会自动引入:
- Jakarta Validation API(jakarta.validation:jakarta.validation-api)
- Hibernate Validator 8.x(org.hibernate.validator:hibernate-validator)
- Spring 与 Validation 的整合组件
无需单独引入 Hibernate Validator,避免版本冲突。
2. 创建实体类(并添加校验注解)
在实体类字段上添加校验注解,注意 Spring Boot 3 使用的是jakarta.validation包下的注解:
package com.example.demo.entity;
import jakarta.validation.constraints.*;
import java.io.Serializable;
public class User implements Serializable {
private Long id;
@NotBlank(message = "用户名不能为空")
@Size(min = 2, max = 20, message = "用户名长度必须在2-20个字符之间")
private String username;
@NotBlank(message = "密码不能为空")
@Pattern(regexp = "^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[@#$%^&*])[a-zA-Z0-9@#$%^&*]{8,16}$",
message = "密码必须包含字母、数字和特殊字符,长度8-16位")
private String password;
@NotNull(message = "年龄不能为空")
@Min(value = 18, message = "年龄不能小于18岁")
@Max(value = 120, message = "年龄不能大于120岁")
private Integer age;
@NotBlank(message = "邮箱不能为空")
@Email(message = "邮箱格式不正确")
private String email;
// getter和setter方法 或使用注解lombok
}
3. 全局异常处理
异常处理说明:
1.MethodArgumentNotValidException:处理@RequestBody参数的校验异常
2.ConstraintViolationException:处理路径变量、请求参数(@RequestParam)的校验异常
3.通过@ResponseStatus指定 HTTP 状态码为 400(Bad Request)
4.统一返回格式,包含错误代码、提示信息和具体错误字段
package com.example.demo.exception;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
import java