为何需在类上添加@Validated才能触发@Positive参数校验?
为何@Positive注解需要添加@Validated才能触发校验?
Spring中,方法参数上的JSR-380校验注解(比如@Positive)默认不会自动触发校验逻辑,必须通过在类级别添加@Validated注解来激活Spring的方法参数校验机制,具体原因如下:
1. 校验触发依赖Spring AOP切面
Spring的方法参数校验是通过ValidationInterceptor这个AOP切面实现的。@Validated注解的核心作用就是标记当前类需要被这个切面拦截,从而在方法执行前对参数进行校验。如果你的Controller类没有添加@Validated,Spring不会对该类的方法参数执行校验逻辑,参数上的@Positive注解相当于无效,请求会直接进入方法体,进而触发服务层的“Hotel configuration not found”错误。
2. 关于“之前无需注解即可生效”的可能原因
你之前遇到无需@Validated就能生效的场景,大概率是以下情况之一:
- 参数封装在实体类中:如果之前的校验是针对
@RequestBody或@ModelAttribute绑定的实体类字段,使用@Valid注解标记实体参数即可触发校验,这种场景不需要类级别的@Validated。 - 旧版本Spring Boot的默认行为:在部分较早的Spring Boot版本中,可能默认对Controller的方法参数启用了校验,但后续版本为了灵活性调整了默认逻辑,要求显式添加
@Validated来开启方法参数校验。 - 全局配置开启了校验:之前的项目可能通过
@EnableValidation或自定义配置类全局开启了方法参数校验,无需每个类单独添加@Validated。
3. JSR-380注解与@Validated的职责区分
@Positive、@NotBlank这类注解属于JSR-380(Bean Validation 2.0)规范,仅定义参数的校验规则;而@Validated是Spring提供的注解,负责告诉Spring:“这个类的方法需要被校验”,是激活校验逻辑的开关。二者职责不同,缺一不可。
结合你的代码场景:
- 未添加
@Validated时,负数的hotelCode会直接传入findByHotel方法,服务层因找不到对应酒店抛出错误; - 添加
@Validated后,Spring会在方法执行前拦截请求,校验hotelCode是否符合@Positive规则,直接返回校验错误,不会进入服务层逻辑。
内容的提问来源于stack exchange,提问作者User1
相关产品推荐
相关产品推荐

