Spring Boot微服务多数据源配置时出现java.lang.NoSuchMethodError异常求助
Spring Boot微服务多数据源配置时出现java.lang.NoSuchMethodError异常求助
大家好,我正在尝试搭建一个能从多个数据库拉取数据的Spring Boot微服务,但在配置过程中遇到了启动异常,想请社区的朋友们帮忙排查下问题。
我的配置情况
1. application.properties配置
spring.datasource.primary.url=jdbc:postgresql://localhost:5432/firstdbsample spring.datasource.primary.username=postgres spring.datasource.primary.password=postgresql spring.datasource.primary.driver-class-name=org.postgresql.Driver spring.datasource.secondary.url=jdbc:postgresql://localhost:5432/seconddbsample spring.datasource.secondary.username=postgres spring.datasource.secondary.password=postgresql spring.datasource.secondary.driver-class-name=org.postgresql.Driver
2. 项目包结构
我把不同数据源对应的代码拆分到了独立的包中:
- com.multidb.primary.controller
- com.multidb.primary.model
- com.multidb.primary.repository
- com.multidb.secondary.controller
- com.multidb.secondary.model
- com.multidb.secondary.repository
- com.multidb.config(存放两个数据源的配置类)
3. 数据源配置类
PrimaryConfig.java
@Configuration @EnableJpaRepositories( basePackages = "com.multidb.primary.repository", entityManagerFactoryRef = "primaryEntityManagerFactory", transactionManagerRef = "primaryTransactionManager" ) public class PrimaryConfig { @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "primaryEntityManagerFactory") public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory( @Qualifier("primaryDataSource") DataSource dataSource) { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource); em.setPackagesToScan(new String[] { "com.multidb.primary.model" }); HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); return em; } @Bean(name = "primaryTransactionManager") public PlatformTransactionManager primaryTransactionManager( @Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } }
SecondaryConfig.java
@Configuration @EnableJpaRepositories( basePackages = "com.multidb.secondary.repository", entityManagerFactoryRef = "secondaryEntityManagerFactory", transactionManagerRef = "secondaryTransactionManager" ) public class SecondaryConfig { @Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryEntityManagerFactory") public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory( @Qualifier("secondaryDataSource") DataSource dataSource) { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource); em.setPackagesToScan(new String[] { "com.multidb.secondary.model" }); HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); return em; } @Bean(name = "secondaryTransactionManager") public PlatformTransactionManager secondaryTransactionManager( @Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } }
抛出的异常信息
Correct the classpath of your application so that it contains a single, compatible version of org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension Exception in thread "main" java.lang.IllegalStateException: java.lang.NoSuchMethodError: 'void org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension.registerLazyIfNotAlreadyRegistered(java.util.function.Supplier, org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.String, java.lang.Object)'
我做过的尝试
我参考了一些主流的Spring Boot多数据源配置教程,按照教程里的步骤拆分了包和配置类,但还是遇到了这个问题。我的项目是基于Maven构建的,pom.xml引入了Spring Data JPA、PostgreSQL驱动等核心依赖。
可能的排查方向(社区建议)
这个异常几乎都是依赖版本冲突导致的:JpaRepositoryConfigExtension类的registerLazyIfNotAlreadyRegistered方法在不同版本的Spring Data JPA中签名不一致,项目里可能同时引入了多个版本的Spring Data相关组件。
你可以按以下步骤排查:
- 查看Maven依赖树:执行
mvn dependency:tree命令,搜索spring-data-jpa和spring-data-commons相关依赖,检查是否有不同版本的组件被引入(比如第三方依赖间接带进来的旧版本)。 - 统一Spring生态版本:尽量使用Spring Boot的父依赖来管理版本,避免手动指定Spring Data JPA等组件的版本,确保Spring Boot、Spring Data JPA、Spring Data Commons的版本完全匹配。
- 排除冲突依赖:如果发现某个依赖引入了不兼容的Spring Data版本,在pom.xml里用
<exclusions>标签把冲突的依赖排除掉。 - 清理缓存重新构建:执行
mvn clean install清理本地仓库的缓存,重新构建项目,确保依赖是最新且一致的。
另外,也可以检查下配置类的扫描路径是否有重叠,但从你的代码来看,两个数据源的扫描包是完全分开的,这个问题的概率很低,优先排查依赖版本问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

