You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多数据源绑定相同前缀@ConfigurationProperties出现重复定义报错如何解决

报错原因分析

首先可以明确该错误不是IDE导致的,是Spring Boot的spring-boot-configuration-processor注解处理器新增的编译期校验规则触发的,之前运行正常现在报错通常是两种情况导致的:

  • 近期升级了Spring Boot版本,2.2.x及以上版本正式加入了同一配置前缀重复绑定的校验逻辑
  • 之前的构建配置未启用注解处理器,近期新增了该依赖或开启了annotation processing编译规则
无需修改配置文件的解决方案

方案1:手动复用公共配置(推荐,无副作用)

单独定义公共配置类绑定目标前缀,再手动将属性注入到两个数据源中,完全不需要修改原有配置文件:

  1. 定义公共Hikari配置属性类
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public class CommonHikariProperties {
    private long connectionTimeout;
    private long validationTimeout;
    private long leakDetectionThreshold;
    private long maxLifetime;
    // 补充所有需要复用的属性的getter、setter方法
}
  1. 调整数据源配置类逻辑
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:15:03