Spring Boot 2.6.9应用REST API出现ConstraintDeclarationException求助
错误原因
这个HV000152异常来自Hibernate Validator(Spring Boot默认的JSR-380实现),核心冲突是:
你的AppConfig类被Spring的CGLIB动态代理生成了增强类AppConfig$$EnhancerBySpringCGLIB$$1fccb006,原类的setApiVersion(String)方法和代理类的同名方法都声明了参数校验约束,违反了Validator的规则——并行类型中的两个方法如果被同一个方法覆盖,不能同时声明参数约束。
之所以偶尔触发(60天出现两次),是因为CGLIB代理的生成并非每次启动或调用都会触发,只有在特定场景(比如Bean懒加载初始化、上下文刷新)才会生成代理类,所以大部分调用正常。
可行解决方案
1. 将校验注解移至字段而非set方法参数
把set方法参数上的校验注解(比如@NotBlank、@NotNull)直接加到类的字段上,避免代理类继承方法参数的约束:
public class AppConfig { // 把注解移到字段上 @NotBlank private String apiVersion; // set方法不再保留参数注解 public void setApiVersion(String apiVersion) { this.apiVersion = apiVersion; } }
2. 关闭AppConfig的CGLIB代理
如果AppConfig是配置类且不需要代理(比如没有AOP切面、无需事务增强),可以通过@ProxyBeanMethods(false)关闭代理:
@Configuration(proxyBeanMethods = false) public class AppConfig { // 类内容 }
如果不是配置类,可以通过自定义BeanPostProcessor过滤该类,避免生成代理。
3. 升级Hibernate Validator版本
Spring Boot 2.6.9默认依赖的Hibernate Validator 6.2.3.Final存在代理类约束处理的bug,升级到6.2.5.Final及以上版本可修复该问题:
- Maven:在
pom.xml中指定版本
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.2.5.Final</version> </dependency>
- Gradle:在
build.gradle中指定版本
implementation 'org.hibernate.validator:hibernate-validator:6.2.5.Final'
4. 移除set方法的参数校验注解
如果不需要对setApiVersion的参数做校验,直接删除参数上的校验注解即可;若需要校验,仅保留字段级注解。
内容的提问来源于stack exchange,提问作者RagaSGNur

