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)有内置支持,无需额外依赖即可触发
1万+

被折叠的 条评论
为什么被折叠?



