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

