You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Spring Boot 1.5.2中自定义ConstraintValidator执行两次问题咨询

解决Spring Boot 1.5.x中自定义ConstraintValidator执行两次的问题

根据你描述的场景(Spring Boot 1.5.2.RELEASE + hibernate-validator 5.3.4.Final),自定义校验器被执行两次的核心原因很明确:你在接口IBinRegistryApi和实现类BinRegistryApiImpl上同时添加了@Validated注解,导致双重校验触发。

具体原因解析

在Spring Boot 1.5.x版本中:

  • 当你在标注了@RestController的接口上添加@Validated时,Spring MVC会在请求进入时对接口的参数进行校验(属于Controller层的请求校验)。
  • 同时你在实现类上也加了@Validated,Spring会通过AOP为实现类创建代理,触发方法级别的校验(属于Bean方法的AOP校验)。
    这两个校验流程会各自调用一次你的自定义ConstraintValidator,所以就出现了执行两次的情况。

解决方案

  1. 移除实现类上的@Validated注解
    只保留接口IBinRegistryApi上的@Validated即可,这样只会触发Spring MVC的请求参数校验,避免AOP层面的重复校验。修改后的实现类代码如下:

    @Component
    @Slf4j
    public class BinRegistryApiImpl implements IBinRegistryApi {
        @Override
        public ResponseEntity getWalletByCard(@NonceValid @RequestHeader(...) String nonce, ...) {
            // 业务逻辑
        }
    }
    
  2. 额外排查点(如果问题仍存在)

    • 检查是否手动配置了LocalValidatorFactoryBean或其他Validator相关的Bean,确保没有重复注册校验器实例。
    • 确认你的自定义ConstraintValidator是否被Spring容器多次实例化(比如是否同时通过@Component和手动注册的方式加入容器)。

验证方式

修改后可以在自定义ConstraintValidatorisValid方法中添加日志,观察请求触发时是否只执行一次,以此确认问题解决。

内容的提问来源于stack exchange,提问作者Nghia Do

火山引擎 最新活动