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,所以就出现了执行两次的情况。
解决方案
移除实现类上的
@Validated注解
只保留接口IBinRegistryApi上的@Validated即可,这样只会触发Spring MVC的请求参数校验,避免AOP层面的重复校验。修改后的实现类代码如下:@Component @Slf4j public class BinRegistryApiImpl implements IBinRegistryApi { @Override public ResponseEntity getWalletByCard(@NonceValid @RequestHeader(...) String nonce, ...) { // 业务逻辑 } }额外排查点(如果问题仍存在)
- 检查是否手动配置了
LocalValidatorFactoryBean或其他Validator相关的Bean,确保没有重复注册校验器实例。 - 确认你的自定义
ConstraintValidator是否被Spring容器多次实例化(比如是否同时通过@Component和手动注册的方式加入容器)。
- 检查是否手动配置了
验证方式
修改后可以在自定义ConstraintValidator的isValid方法中添加日志,观察请求触发时是否只执行一次,以此确认问题解决。
内容的提问来源于stack exchange,提问作者Nghia Do




