无类源码时验证控制器请求体:自定义JsonPatch验证注解未生效
解决自定义JsonPatch参数验证器不触发的问题
问题根源
Spring Web中,针对方法参数的自定义约束注解,仅靠@Valid无法触发验证——尤其是你使用suspend挂起函数的场景。需要通过@Validated明确激活参数验证逻辑,同时要保证验证器被Spring正确识别为Bean。
具体修复步骤
1. 给控制器类添加@Validated注解
@Valid主要负责嵌套对象的验证,参数级的自定义约束必须靠@Validated告知Spring触发参数验证:
@RestController @Validated // 必须添加此注解,否则参数级自定义注解不生效 class PatchController { @PatchMapping("/{id}", consumes = ["application/json-patch+json"]) suspend fun patch( @PathVariable id: UUIDv7, @RequestBody @ValidJsonPatch // 此处无需再加@Valid patch: JsonPatch, ): ResponseEntity<*> { // 你的业务逻辑实现 } }
2. 将验证器注册为Spring Bean
给JsonPatchValidator添加@Component注解,让Spring能够扫描并管理这个验证器实例:
@Component class JsonPatchValidator : ConstraintValidator<ValidJsonPatch, JsonPatch> { override fun isValid(value: JsonPatch, context: ConstraintValidatorContext): Boolean { // 编写你的JsonPatch验证逻辑,比如检查操作类型、路径合法性等 return true } }
3. 确认注解目标范围(你已配置正确)
你的@ValidJsonPatch已经设置了@Target(AnnotationTarget.VALUE_PARAMETER),这个配置是正确的,确保注解可以应用在方法参数上。
额外提醒
- 如果你使用Spring Boot 3.x,确保依赖的是
jakarta.validation相关包,你的代码中已经使用Jakarta的Payload,这部分无需调整。 - 挂起函数的参数验证逻辑和普通同步方法不同,必须通过
@Validated才能触发参数级的自定义约束,@Valid无法处理该场景。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

