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

Spring 3.1.2升级后shardingDataSource Bean的dataSourceMap未填充问题

问题分析与解决方案

Spring 3.1.2升级后ShardingSphere的dataSourceMap未填充,核心原因在于Spring版本升级后的配置绑定、Bean注册逻辑变化,以及自定义数据源类的注解冲突。以下是具体排查和修复步骤:

1. 修复自定义数据源类的注解冲突

你的MySQLDataSource同时标注了@Component和@Configuration,Spring 3.x对这两个注解的处理逻辑更严格:@Configuration会被当作配置类解析,而非普通Bean,导致ShardingSphere无法正确识别并组装数据源。

修改MySQLDataSource,移除@Configuration注解:

@Data
@Component("shardingDataSource")
// 移除@Configuration,仅保留Component作为普通Bean注册
public class MySQLDataSource extends HikariDataSource {
    private Map<String, String> config;

    public void addConfig(String key, String value) {
        if (config == null) {
            config = new HashMap<>();
        }
        config.put(key, value);
    }
}

2. 调整配置绑定逻辑

Spring 3.x对外部配置的绑定方式有更新,原有的@PropertySource加载配置后,需要显式启用配置绑定才能被ShardingSphere的自动配置识别。

修改AppConfigProperties,添加@EnableConfigurationProperties:

@Configuration
@PropertySource("file:/etc/appconf/project/sharding/app-rule.properties")
@EnableConfigurationProperties // 启用配置绑定,让ShardingSphere能读取配置
public class AppConfigProperties {
}

如果需要更精准的配置绑定,可以新增配置属性类:

@Configuration
@PropertySource("file:/etc/appconf/project/sharding/app-rule.properties")
@ConfigurationProperties(prefix = "spring.shardingsphere.datasource")
public class AppConfigProperties {
    private Map<String, DataSourceProps> datasources;

    // Getter & Setter
    @Data
    public static class DataSourceProps {
        private String type;
        private String driverClassName;
        private String jdbcUrl;
        private String username;
        private String password;
        private String poolName;
    }
}

3. 确认ShardingSphere版本兼容性

如果是Spring Boot 3.1.2(对应Spring Framework 6.x),必须使用ShardingSphere 5.4.0及以上版本,低版本不支持Spring Boot 3.x。检查依赖配置:

Maven示例:

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>5.4.1</version>
</dependency>

Gradle示例:

implementation 'org.apache.shardingsphere:shardingsphere-jdbc-core-spring-boot-starter:5.4.1'

4. 修正Bean获取逻辑

原代码中获取的shardingDataSource是你自定义的Bean,而非ShardingSphere自动组装的ShardingDataSource。ShardingSphere自动注册的Bean默认名称为shardingSphereDataSource,调整获取逻辑:

DataSource dataSource = context.getBean("shardingSphereDataSource", DataSource.class);

或通过依赖注入:

@Autowired
private DataSource shardingSphereDataSource;

5. 验证数据源实例化逻辑

确保配置文件中spring.shardingsphere.datasource.local00.type的全类名正确,且MySQLDataSource有公开的默认构造方法,ShardingSphere需要通过反射实例化数据源对象。

内容的提问来源于stack exchange,提问作者Chandan Bansal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:08:16