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

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相关组件。

你可以按以下步骤排查:

  1. 查看Maven依赖树:执行mvn dependency:tree命令,搜索spring-data-jpa和spring-data-commons相关依赖,检查是否有不同版本的组件被引入(比如第三方依赖间接带进来的旧版本)。
  2. 统一Spring生态版本:尽量使用Spring Boot的父依赖来管理版本,避免手动指定Spring Data JPA等组件的版本,确保Spring Boot、Spring Data JPA、Spring Data Commons的版本完全匹配。
  3. 排除冲突依赖:如果发现某个依赖引入了不兼容的Spring Data版本,在pom.xml里用<exclusions>标签把冲突的依赖排除掉。
  4. 清理缓存重新构建:执行mvn clean install清理本地仓库的缓存,重新构建项目,确保依赖是最新且一致的。

另外,也可以检查下配置类的扫描路径是否有重叠,但从你的代码来看,两个数据源的扫描包是完全分开的,这个问题的概率很低,优先排查依赖版本问题。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 06:49:35