多数据源绑定相同前缀@ConfigurationProperties出现重复定义报错如何解决
报错原因分析
首先可以明确该错误不是IDE导致的,是Spring Boot的spring-boot-configuration-processor注解处理器新增的编译期校验规则触发的,之前运行正常现在报错通常是两种情况导致的:
- 近期升级了Spring Boot版本,2.2.x及以上版本正式加入了同一配置前缀重复绑定的校验逻辑
- 之前的构建配置未启用注解处理器,近期新增了该依赖或开启了annotation processing编译规则
无需修改配置文件的解决方案
方案1:手动复用公共配置(推荐,无副作用)
单独定义公共配置类绑定目标前缀,再手动将属性注入到两个数据源中,完全不需要修改原有配置文件:
- 定义公共Hikari配置属性类
@ConfigurationProperties(prefix = "spring.datasource.hikari") public class CommonHikariProperties { private long connectionTimeout; private long validationTimeout; private long leakDetectionThreshold; private long maxLifetime; // 补充所有需要复用的属性的getter、setter方法 }
- 调整数据源配置类逻辑
@Configuration @EnableConfigurationProperties(CommonHikariProperties.class) public class DataSourceConfig { @Autowired private CommonHikariProperties commonHikariProperties; @Bean public HikariDataSource dataSource() throws Exception { HikariDataSource dataSource = new HikariDataSource(); // 注入公共配置 dataSource.setConnectionTimeout(commonHikariProperties.getConnectionTimeout()); dataSource.setValidationTimeout(commonHikariProperties.getValidationTimeout()); dataSource.setLeakDetectionThreshold(commonHikariProperties.getLeakDetectionThreshold()); dataSource.setMaxLifetime(commonHikariProperties.getMaxLifetime()); // 补充当前数据源的url、用户名、密码等个性化配置 return dataSource; } @Bean public HikariDataSource altDataSource() throws Exception { HikariDataSource altDataSource = new HikariDataSource(); // 注入公共配置 altDataSource.setConnectionTimeout(commonHikariProperties.getConnectionTimeout()); altDataSource.setValidationTimeout(commonHikariProperties.getValidationTimeout()); altDataSource.setLeakDetectionThreshold(commonHikariProperties.getLeakDetectionThreshold()); altDataSource.setMaxLifetime(commonHikariProperties.getMaxLifetime()); // 补充第二个数据源的个性化配置 return altDataSource; } }
方案2:关闭编译期校验(改动最小)
如果不想修改现有代码,只需要在构建配置中添加参数关闭重复前缀校验即可,原有代码和配置都不需要改动:
Gradle项目配置
在build.gradle中添加编译参数:
compileJava { options.compilerArgs += ["-AdisableDuplicatePrefixCheck=true"] }
Maven项目配置
在pom.xml的maven-compiler-plugin配置中添加参数:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <annotationProcessorPaths> <path> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <version>${spring.boot.version}</version> </path> </annotationProcessorPaths> <compilerArgs> <arg>-AdisableDuplicatePrefixCheck=true</arg> </compilerArgs> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者whatanoob
相关产品推荐
相关产品推荐

