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 会自动完成参数校验,无需手动编写校验逻辑,大幅提升开发效率。

相关推荐
Cosolar16 分钟前
极简智库(MiniDocs):docsify、VitePress、Notion 等知识库搭建服务的完美替代
前端·后端·架构
Goboy33 分钟前
夯爆了,我被一个一句话接入的免费可观测平台策反了,那一刻我决定放弃用了3年的Prometheus
后端·docker·kubernetes
奶油话梅糖1 小时前
打开项目 0.9 秒、内存只有 IDEA 的 1/12:OpenIDEA 用 Rust 把 IntelliJ IDEA 重造了一遍
java·rust·github·intellij-idea
回家路上绕了弯1 小时前
Agent in the Sandbox:当 AI 有了自己的开发环境
后端
vipxieliang1 小时前
语言对比卡:PHP vs Go vs Java 的优缺点、适用场景与「为什么选 PHP」
java·go·php
陈随易1 小时前
TanStarter,从搭建到支付,一步到位开始赚美元
前端·后端·程序员
Rain的Java大神之路1 小时前
公交App上“还有2站,约5分钟”怎么实现?90%的人答错这道大厂面试题:GPS漂移、ETA不准、10万QPS热点读全拆透(附完整代码)
java·后端·面试
挖掘狂人1 小时前
MySQL 深分页优化:limit 100000, 10 慢在哪,怎么救
后端·sql·mysql
golang学习记2 小时前
IDEA 2026.3 远程开发迎来重磅升级
java·ide·intellij-idea·远程开发
天天被压力2 小时前
【A股分钟级高频数据完全手册 #04】指数分钟级行情数据接口:沪深指数Pro版最新分时取数
java·人工智能·python