Spring Boot 自动参数校验

在 Spring Boot 中实现参数自动校验主要依靠 Java Bean Validation API(JSR 380)和 Spring 的集成支持。以下是详细实现步骤:


1. 添加依赖

pom.xml 中添加验证依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2. 在实体类/DTO中添加校验注解

使用注解标记需要校验的字段:

java 复制代码
public class UserDTO {
    @NotBlank(message = "用户名不能为空")
    private String username;

    @Email(message = "邮箱格式不正确")
    private String email;

    @Min(value = 18, message = "年龄必须大于18岁")
    private int age;

    @Pattern(regexp = "1[3-9]\\d{9}", message = "手机号格式不正确")
    private String phone;

    // Getter/Setter省略
}

常用校验注解

  • @NotNull:非 null
  • @NotBlank:非空(字符串)
  • @NotEmpty:非空集合/数组
  • @Min/@Max:数值范围
  • @Size:长度范围
  • @Email:邮箱格式
  • @Pattern:正则表达式

3. 在Controller中使用校验

在接收参数的请求方法中添加 @Valid@Validated

java 复制代码
@PostMapping("/create")
public ResponseEntity<?> createUser(@Valid @RequestBody UserDTO userDTO) {
    // 校验通过后执行业务逻辑
    return ResponseEntity.ok("用户创建成功");
}

注意@Valid 是标准 JSR 注解,@Validated 是 Spring 的增强版(支持分组校验)。


4. 处理校验异常

添加全局异常处理器捕获校验失败异常:

java 复制代码
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidationException(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> {
            errors.put(error.getField(), error.getDefaultMessage());
        });
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors);
    }
}

响应示例

json 复制代码
{
    "username": "用户名不能为空",
    "email": "邮箱格式不正确"
}

5. 进阶用法

分组校验(不同场景不同规则)
  1. 定义分组接口:

    java 复制代码
    public interface CreateGroup {}
    public interface UpdateGroup {}
  2. 在 DTO 中指定分组:

    java 复制代码
    public class UserDTO {
        @NotNull(groups = UpdateGroup.class, message = "ID不能为空")
        private Long id;
    
        @NotBlank(groups = {CreateGroup.class, UpdateGroup.class})
        private String name;
    }
  3. Controller 指定分组:

    java 复制代码
    @PostMapping("/update")
    public void updateUser(@Validated(UpdateGroup.class) @RequestBody UserDTO dto) {
        // ...
    }
自定义校验注解
  1. 创建自定义注解:

    java 复制代码
    @Target({FIELD})
    @Retention(RUNTIME)
    @Constraint(validatedBy = PhoneValidator.class)
    public @interface ValidPhone {
        String message() default "手机号格式错误";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
    }
  2. 实现校验逻辑:

    java 复制代码
    public class PhoneValidator implements ConstraintValidator<ValidPhone, String> {
        @Override
        public boolean isValid(String phone, ConstraintValidatorContext context) {
            return phone != null && phone.matches("1[3-9]\\d{9}");
        }
    }

6. 测试校验

使用 Postman 或 curl 发送无效请求:

bash 复制代码
curl -X POST http://localhost:8080/create \
-H "Content-Type: application/json" \
-d '{"username":"", "email":"invalid-email"}'

将返回:

json 复制代码
{
    "username": "用户名不能为空",
    "email": "邮箱格式不正确"
}

总结流程:

graph TD A[添加依赖] --> B[DTO添加校验注解] B --> C[Controller添加@Valid] C --> D[全局异常处理器] D --> E[返回错误信息]

通过以上步骤,Spring Boot 会自动完成参数校验,无需手动编写校验逻辑,大幅提升开发效率。

相关推荐
没有bug.的程序员5 分钟前
电商系统分布式架构实战:从单体到微服务的演进之路
java·分布式·微服务·云原生·架构·监控体系·指标采集
Query*14 分钟前
Java 设计模式——代理模式:从静态代理到 Spring AOP 最优实现
java·设计模式·代理模式
梵得儿SHI16 分钟前
Java 反射机制深度解析:从对象创建到私有成员操作
java·开发语言·class对象·java反射机制·操作类成员·三大典型·反射的核心api
JAVA学习通20 分钟前
Spring AI 核心概念
java·人工智能·spring·springai
望获linux22 分钟前
【实时Linux实战系列】实时 Linux 在边缘计算网关中的应用
java·linux·服务器·前端·数据库·操作系统
绝无仅有30 分钟前
面试真实经历某商银行大厂数据库MYSQL问题和答案总结(二)
后端·面试·github
绝无仅有31 分钟前
通过编写修复脚本修复 Docker 启动失败(二)
后端·面试·github
..Cherry..34 分钟前
【java】jvm
java·开发语言·jvm
老K的Java兵器库43 分钟前
并发集合踩坑现场:ConcurrentHashMap size() 阻塞、HashSet 并发 add 丢数据、Queue 伪共享
java·后端·spring
冷冷的菜哥1 小时前
go邮件发送——附件与图片显示
开发语言·后端·golang·邮件发送·smtp发送邮件