当前位置: 首页 > news >正文

Spring Boot 参数验证

一、依赖配置

首先确保在 pom.xml 中添加了以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

这个依赖包含了 Hibernate Validator(JSR-380 规范的实现)和必要的 Spring 验证支持。

验证执行流程

  • 当请求到达Controller方法时,Spring会检查方法参数上的@Valid@Validated注解

  • 触发MethodValidationInterceptor拦截器

  • 创建Validator实例并执行验证

  • 验证器会递归检查对象及其属性上的所有约束注解

  • 如果验证失败,收集所有违反的约束

二、基本验证注解

以下是常用的验证注解:

  • @NotNull - 值不能为 null

  • @Null - 值必须为 null

  • @AssertTrue - 值必须为 true

  • @AssertFalse - 值必须为 false

  • @Min(value) - 数字必须大于等于指定值

  • @Max(value) - 数字必须小于等于指定值

  • @DecimalMin(value) - 必须大于等于指定值(字符串形式表示)

  • @DecimalMax(value) - 必须小于等于指定值(字符串形式表示)

  • @Size(min, max) - 集合/字符串/数组大小必须在范围内

  • @Digits(integer, fraction) - 数字格式检查

  • @Past - 必须是过去的日期

  • @PastOrPresent - 必须是过去或现在的日期

  • @Future - 必须是将来的日期

  • @FutureOrPresent - 必须是将来或现在的日期

  • @Pattern(regex) - 必须匹配正则表达式

  • @Email - 必须是有效的邮箱格式

  • @Valid - 级联验证,用于验证对象中的嵌套对象

三、使用示例

1. 在实体类中使用验证注解

public class User {@NotNull(message = "用户ID不能为空")private Long id;@NotBlank(message = "用户名不能为空")@Size(min = 2, max = 20, message = "用户名长度必须在2-20之间")private String username;@Email(message = "邮箱格式不正确")private String email;@Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,}$", message = "密码必须至少8个字符,包含大小写字母和数字")private String password;@Min(value = 18, message = "年龄必须大于等于18")@Max(value = 100, message = "年龄必须小于等于100")private Integer age;@Past(message = "出生日期必须是过去的时间")private LocalDate birthday;// getters and setters
}

2. 在Controller中使用验证

@RestController
@RequestMapping("/api/users")
public class UserController {@PostMappingpublic ResponseEntity<String> createUser(@Valid @RequestBody User user) {// 业务逻辑处理return ResponseEntity.ok("用户创建成功");}@GetMapping("/{id}")public ResponseEntity<User> getUserById(@PathVariable @Min(1) Long id,@RequestParam(required = false) @Size(max = 100) String name) {// 业务逻辑处理return ResponseEntity.ok(new User());}
}

3. 处理验证错误

当验证失败时,Spring 会抛出 MethodArgumentNotValidException。可以全局处理这些异常:

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<ErrorResponse> handleValidationExceptions(MethodArgumentNotValidException ex) {List<FieldError> fieldErrors = ex.getBindingResult().getFieldErrors();List<ErrorDetail> errorDetails = fieldErrors.stream().map(error -> new ErrorDetail(error.getField(),error.getRejectedValue(),error.getDefaultMessage())).collect(Collectors.toList());ErrorResponse response = new ErrorResponse("VALIDATION_FAILED","参数验证失败",errorDetails);return ResponseEntity.badRequest().body(response);}
}// 响应数据结构
public class ErrorResponse {private String code;private String message;private List<ErrorDetail> details;// 构造方法/getters/setters
}public class ErrorDetail {private String field;private Object rejectedValue;private String message;// 构造方法/getters/setters
}

响应示例

当验证失败时,返回的JSON结构如下:

{"code": "VALIDATION_FAILED","message": "参数验证失败","details": [{"field": "age","rejectedValue": 15,"message": "年龄必须大于等于18"},{"field": "email","rejectedValue": "invalid-email","message": "必须是有效的邮箱格式"}]
}

相关文章:

  • MySQL性能调优探秘:我的实战笔记 (下篇:深入内核、锁与监控)
  • 基于STM32、HAL库的BME680气压传感器 驱动程序设计
  • 【题解-洛谷】B3881 [信息与未来 2015] 拴奶牛
  • 免费Office图片音频高效提取利器
  • Autoregressive Distillation of Diffusion Transformers
  • (自用)Java学习-5.8(总结,springboot)
  • css 点击后改变样式
  • SAGAR线上网页程序生成准随机结构(SQS)
  • Vue学习百日计划-Deepseek版
  • CRM和SCRM有什么区别
  • 【HTOP 使用指南】:如何理解主从线程?(以 Faster-LIO 为例)
  • 接口出现 请求参数格式错误 的解决方法
  • 02.Golang 切片(slice)源码分析(一、定义与基础操作实现)
  • 流体力学绪论(期末复习)
  • LVGL(线条控件lv_line)
  • cursor 出现问题 为客户解决问题
  • 解构赋值
  • 2025智能体基建在进化过程中带来的质变
  • VBA —— 学习Day6
  • 0512 - 2094. 找出 3 位偶数
  • 福州千余公共道路泊车位装“智能地锁”续:运营公司被责令改正并罚款
  • 江西吉水通报一男子拒服兵役:不得考公,两年内经商、升学等受限
  • 影子调查丨三名“淘金客”殒命雪峰山:千余废弃金矿洞的监管难题
  • 被流量绑架人生,《人生开门红》能戳破网络时代的幻象吗
  • 河南洛阳新安县煤渣倾倒耕地:多年难恢复,为何至今未解决?
  • 鄂州:锁死中小学教师编制总量,核减小学编制五百名增至初中