首页 > 解决方案 > *.configuration.SecondaryDataSource 中方法 entityManagerFactory 的参数 0 需要找不到类型为“*.EntityManagerFactoryBuilder”的 bean

问题描述

我有 2 个数据库连接方案,一个使用 neo4j,一个使用 mariadb。因此编写了两个配置类来扫描存储库和域类,但在启动 Spring Boot 应用程序时出现以下错误。

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "barEntityManagerFactory",
    transactionManagerRef = "barTransactionManager", basePackages = {"com.nkt.nsw.uiv.uam.foo.repo"})
@Profile("UAM")
public class PrimarydataSource {

@Autowired
private Environment env;

  @Bean(name = "barDataSource")
  @ConfigurationProperties(prefix = "bar.datasource")
  public DataSource dataSource() {
//    return DataSourceBuilder.create().build();
      DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUrl(env.getProperty("bar.datasource.url"));
        dataSource.setDriverClassName(env.getProperty("bar.datasource.driver-class-name"));
        dataSource.setUsername(env.getProperty("bar.datasource.username"));
        dataSource.setPassword(env.getProperty("bar.datasource.password"));

        return dataSource;
  }
 @Bean(name = "barEntityManagerFactory")
  public LocalContainerEntityManagerFactoryBean barEntityManagerFactory(
      EntityManagerFactoryBuilder builder, @Qualifier("barDataSource") DataSource dataSource) {
    return builder.dataSource(dataSource).packages("com.nkt.nsw.uiv.uam.foo.domain")
        .build();
  }

  @Bean(name = "barTransactionManager")
  public PlatformTransactionManager barTransactionManager(
      @Qualifier("barEntityManagerFactory") EntityManagerFactory barEntityManagerFactory) {
    return new JpaTransactionManager(barEntityManagerFactory);
  }

}




@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory",
    basePackages = {"com.nkt.nsw.uiv.uam.repository"})
@Profile("UAM")
public class SecondaryDataSource {

     @Autowired
        private Environment env;

  @Primary
  @Bean(name = "dataSource")
  @ConfigurationProperties(prefix = "spring.data")
  public DataSource dataSource() {
//    return DataSourceBuilder.create().build();
      DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUrl(env.getProperty("spring.data.neo4j.uri"));
//      dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        dataSource.setUsername(env.getProperty("spring.data.neo4j.username"));
        dataSource.setPassword(env.getProperty("spring.data.neo4j.password"));

        return dataSource;
  }

@Primary
  @Bean(name = "entityManagerFactory")
  public LocalContainerEntityManagerFactoryBean entityManagerFactory(
      EntityManagerFactoryBuilder builder, @Qualifier("dataSource") DataSource dataSource) {
    return builder.dataSource(dataSource).packages("com.nkt.nsw.uiv.uam.entities")
        .build();
  }

  @Primary
  @Bean(name = "transactionManager")
  public PlatformTransactionManager transactionManager(
      @Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
    return new JpaTransactionManager(entityManagerFactory);
  }
}

马文pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.nokia.nsw.uiv.uam</groupId>
    <artifactId>uiv-uam</artifactId>
    <version>19.9-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>uiv-uam</name>


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath />
    </parent>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <keycloak_version>6.0.0</keycloak_version>
    </properties>

    <dependencies>
        <!-- <dependency> <groupId>com.nokia.nsw.uiv</groupId> <artifactId>uiv-core</artifactId> 
            <version>19.9-SNAPSHOT</version> </dependency> -->
        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-authz-client</artifactId>
            <version>${keycloak_version}</version>
            <!-- <scope>provided</scope> -->
            <!-- <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> 
                <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> -->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.nokia.nsw.uiv.uam.core</groupId>
            <artifactId>uiv-uam-core</artifactId>
            <version>19.9-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <!-- <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-vault-config</artifactId> 
            <version>2.1.2.RELEASE</version> </dependency> -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-commons</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-neo4j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-graphdb-api</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.9.9</version>
        </dependency>

    </dependencies>



    <dependencyManagement>
        <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
                <exclusions>
                    <!--<exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-neo4j</artifactId> 
                        </exclusion> <exclusion> <groupId>org.neo4j</groupId> <artifactId>*</artifactId> 
                        </exclusion> -->
                    <exclusion>
                        <groupId>io.leangen.graphql</groupId>
                        <artifactId>*</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>com.graphql-java</groupId>
                        <artifactId>*</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

        </dependencies>
    </dependencyManagement>
    <!-- <parent> <groupId>com.nokia.nsw.uiv</groupId> <artifactId>uiv-parent</artifactId> 
        <version>19.9-SNAPSHOT</version> </parent> -->

    <!-- <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> -->

</project>

{“类型”:“日志”,“主机”:“N-20HEPF0WQ1U5”,“级别”:“错误”,“neid”:“UIV-FRAMEWORK”,“系统”:“UIV”,“时间”:“ 2019-09-12T11:58:38.730Z", "timezone":"UTC", "log":"\r\n\r\n********************** ************\r\n应用程序启动失败\r\n*********************************\r \n\r\n说明:\r\n\r\ncom.nkt.nsw.uiv.uam.configuration.SecondaryDataSource 中方法 entityManagerFactory 的参数 0 需要 'org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder 类型的 bean ' 找不到。\r\n\r\n\r\n操作:\r\n\r\n考虑在您的配置中定义类型为 'org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder' 的 bean。 \r\n"}

spring.data.neo4j.uri=bolt://135.250.138.117:7687
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=admin@123
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,io.leangen.graphql.spqr.spring.autoconfigure.SpqrAutoConfiguration,org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration
uam.aspect.enabled=false
uiv.kc.adminRealm=master
uiv.kc.adminUser=admin
uiv.kc.adminPassword=admin
uiv.kc.adminApp=uiv-app
uiv.kc.adminSecret=462fe347-d47f-4365-94ee-6aefff994ef2
uiv.kc.adminURL=https://135.250.138.48:8666/auth

bar.datasource.url=jdbc:mariadb://135.250.138.52:3306/METADATA
bar.datasource.username=METADATA
bar.datasource.password=METADATA
bar.datasource.driver-class-name=org.mariadb.jdbc.Driver

标签: springspring-bootspring-data-jpa

解决方案


Probably you have several configurations and in your @SpringBootApplication you have excluded DataSourceAutoConfigration.class like:

@SpringBootApplication(exclude = {DataSourceAutoConfigration.class})

It is adviced to do because otherwise you get multiple beans of type DataSorce,... on initialization. If that is the case, you can remove the exclusion from

@SpringBootApplication

and mark all the beans in one of your configurations as @Primary, like:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "barEntityManagerFactory",
    transactionManagerRef = "barTransactionManager", basePackages = 
    {"com.nkt.nsw.uiv.uam.foo.repo"})
@Profile("UAM")
public class PrimarydataSource {
    @Primary
    @Bean(name = "barDataSource")
    ...
    @Primary
    @Bean(name = "entityManagerFactory")
    ...
}

推荐阅读