SpringBoot项目中:@Validated/@Valid注解对请求体参数失效解决

what?

在这之前,可能有人不太清楚这两个注解的作用,我简单说一下是如何使用的:

在对应实体类的字段值上添加@NotNull(针对非String类) @NotBlank(针对String类),配合@Validated/@Valid注解以及全局处理器捕获异常,可以在spring层面就对传入的值进行非空检验,涉及到多参数的请求体可以更方便对空值进行检验.

这里贴一下使用注解,两个需要导入的包

import javax.validation.Valid;
import org.springframework.validation.annotation.Validated;

写接口的时候,对于单个参数值:在参数中添加注解可以正常触发非空的参数检验

实体类中id字段添加进行判空

@GetMapping("/get")
public String getApartment(@Valid @RequestParam("id") Long Id) {
    return "看见我就说明失效了"
}

但是,在进行测试其他接口,涉及到传请求体的情况时失效,无法正常进行非空判断抛出MethodArgumentNotValidException异常

How?

来回测试了很多次,最后发现没有导入这个依赖,我也是醉了,导包的时候也没有依赖报错,对单个参数也可以正常使用.

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

Why?

问了一下ai,如下:

1. 为何没加spring-boot-starter-validation,@Validated 也能导入不报错?

  • @Validated(全类名:org.springframework.validation.annotation.Validated)来自spring-context 包(Spring 核心容器功能);

  • 项目引入的spring-boot-starter-web会间接依赖spring-context,因此能正常导入注解,无编译错误;

  • 此时@Validated仅为 “校验开关”,无实际校验能力。

2. 为何没加该依赖,@NotNull/@NotBlank 校验无效?

  • @NotNull/@NotBlank是JSR-380(Bean 校验标准)注解,仅定义 “校验规则”,需具体实现类(如 Hibernate Validator)执行校验;
  • spring-boot-starter-validation的核心作用:引入Hibernate Validator(校验实现) + Spring 与校验的整合逻辑;
  • 缺该依赖时,只有 “校验开关”(@Validated),无 “校验执行工具”,故校验不生效。

3. 加依赖后正常的逻辑链

spring-boot-starter-validation引入→Spring 自动配置Validator实例(Hibernate Validator 实现)→@Validated 触发校验→Validator 执行 @NotNull 等规则→校验结果通过异常(如 MethodArgumentNotValidException)返回。

简单来说就是有兵符,没有兵,空有其表.至于为什么单个参数可以正常判空,是因为:Spring MVC 对单个 @RequestParam 参数的基础校验(如 @NotNull 检查是否为 null)有内置支持,无需额外依赖即可触发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值