Нет подходящего bean-компонента типа javax.persistence.EntityManager: ожидался единственный соответствующий bean-компонент, но найдено 2

У меня есть две конфигурации диспетчера сущностей для двух отдельных баз данных, но когда я пытаюсь автоматически подключить диспетчер сущностей для настройки моего bean-компонента GraphQLExecutor, я получаю исключение о том, что есть два bean-компонента, которые соответствуют критериям, хотя я указал имя модуля в PersistenceContext.

Исключение

Entity Manager 1

Entity Manager 2

package com.ogl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
@EnableJpaRepositories(basePackages = "com.ogl.system", entityManagerFactoryRef = "companyEntityManagerFactory", transactionManagerRef = "companyTransactionManager")
public class SystemJpaConfig {

  private final Environment environment;

  @Autowired
  public SystemJpaConfig(Environment environment) {
    this.environment = environment;
  }

  @Bean("systemEntityManagerFactory")
  public LocalContainerEntityManagerFactoryBean systemEntityManagerFactory() {
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    entityManagerFactoryBean.setPackagesToScan("com.ogl.system");
    entityManagerFactoryBean.setPersistenceUnitName("system");
    entityManagerFactoryBean.setDataSource(systemDataSource());

    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
    adapter.setDatabase(Database.POSTGRESQL);
    adapter.setShowSql(true);
    adapter.setGenerateDdl(false);

    entityManagerFactoryBean.setJpaVendorAdapter(adapter);

    return entityManagerFactoryBean;
  }

  @Bean
  DataSource systemDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(environment.getProperty("p4.datasource.driver"));
    dataSource.setUrl(environment.getProperty("p4.system.url"));
    dataSource.setUsername(environment.getProperty("p4.system.user"));
    dataSource.setPassword(environment.getProperty("p4.system.password"));

    return dataSource;
  }

  @Bean
  public PlatformTransactionManager systemTransactionManager() {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory((systemEntityManagerFactory().getObject()));

    return transactionManager;
  }
}

Инъекция

package com.ogl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
@EnableJpaRepositories(basePackages = "com.ogl.company", entityManagerFactoryRef = "companyEntityManagerFactory", transactionManagerRef = "companyTransactionManager")
public class CompanyJpaConfig {

  private final Environment environment;

  @Autowired
  public CompanyJpaConfig(Environment environment) {
    this.environment = environment;
  }

  @Primary
  @Bean("companyEntityManagerFactory")
  public LocalContainerEntityManagerFactoryBean companyEntityManagerFactory() {
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    entityManagerFactoryBean.setPackagesToScan("com.ogl.company");
    entityManagerFactoryBean.setPersistenceUnitName("company");
    entityManagerFactoryBean.setDataSource(companyDataSource());

    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
    adapter.setDatabase(Database.POSTGRESQL);
    adapter.setShowSql(true);
    adapter.setGenerateDdl(false);

    entityManagerFactoryBean.setJpaVendorAdapter(adapter);

    return entityManagerFactoryBean;
  }

  @Bean
  DataSource companyDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(environment.getProperty("p4.datasource.driver"));
    dataSource.setUrl(environment.getProperty("p4.company.url"));
    dataSource.setUsername(environment.getProperty("p4.company.user"));
    dataSource.setPassword(environment.getProperty("p4.company.password"));

    return dataSource;
  }

  @Primary
  @Bean
  public PlatformTransactionManager companyTransactionManager() {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory((companyEntityManagerFactory().getObject()));

    return transactionManager;
  }
}

pom.xml

package com.ogl;

import org.crygier.graphql.GraphQLExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Configuration
@ComponentScan
public class GraphQLJpaConfig {

  @PersistenceContext(unitName = "company")
  private EntityManager entityManager;

  @Bean
  public GraphQLExecutor graphQLExecutor() {
    return new GraphQLExecutor(entityManager);
  }
}

Вы определили два entitymanager. Теперь вам нужно указать пружине, которую следует вводить. Для этого вы можете использовать аннотацию

package com.ogl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
@EnableJpaRepositories(basePackages = "com.ogl.system", entityManagerFactoryRef = "companyEntityManagerFactory", transactionManagerRef = "companyTransactionManager")
public class SystemJpaConfig {

  private final Environment environment;

  @Autowired
  public SystemJpaConfig(Environment environment) {
    this.environment = environment;
  }

  @Bean("systemEntityManagerFactory")
  public LocalContainerEntityManagerFactoryBean systemEntityManagerFactory() {
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    entityManagerFactoryBean.setPackagesToScan("com.ogl.system");
    entityManagerFactoryBean.setPersistenceUnitName("system");
    entityManagerFactoryBean.setDataSource(systemDataSource());

    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
    adapter.setDatabase(Database.POSTGRESQL);
    adapter.setShowSql(true);
    adapter.setGenerateDdl(false);

    entityManagerFactoryBean.setJpaVendorAdapter(adapter);

    return entityManagerFactoryBean;
  }

  @Bean
  DataSource systemDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(environment.getProperty("p4.datasource.driver"));
    dataSource.setUrl(environment.getProperty("p4.system.url"));
    dataSource.setUsername(environment.getProperty("p4.system.user"));
    dataSource.setPassword(environment.getProperty("p4.system.password"));

    return dataSource;
  }

  @Bean
  public PlatformTransactionManager systemTransactionManager() {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory((systemEntityManagerFactory().getObject()));

    return transactionManager;
  }
}
:

<?xml version="1.0" encoding="UTF-8"?>
<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.ogl</groupId>
    <artifactId>jpa-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>jpa-demo</name>
    <description>Demo project for JPA</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <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.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.graphql-java</groupId>
            <artifactId>graphql-java</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.crygier</groupId>
            <artifactId>graphql-jpa</artifactId>
            <version>0.3</version>
        </dependency>
    </dependencies>

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

person MJPearsall    schedule 07.07.2017    source источник
comment
Сделайте один из EntityManager основным   -  person Suraj    schedule 07.07.2017
comment
В моем случае я забыл добавить зависимость maven spring-boot-starter-data-jpa. Спасибо.   -  person StanislavL    schedule 07.07.2017
comment
Добавлен _1_, но по-прежнему получается то же исключение   -  person Dark Star1    schedule 05.09.2018


Ответы (4)


Нашел решение, пометив класс, который я вводил с помощью EntityManager, с помощью @Component, а затем автоматически подключил этот класс к классу, который использует GraphQLExecutor:

@PersistenceContext(unitName = "company")
@Qualifier(<Name of the entitimanager you want to use>)
private EntityManager entityManager;
person Jens    schedule 07.07.2017
comment
@MJPearsall Вы уверены, что это точно такое же исключение? - person MJPearsall; 07.07.2017
comment
В качестве значения квалификатора я использовал имя единицы сохранения состояния (для меня это было _1_). - person Jens; 07.07.2017
comment
Тебе тоже нужен default? - person Julien Kronegg; 04.10.2019

Новый класс с пометкой @Component

Класс автоподключения CompanyGraphQLComponent

package p4;

import org.crygier.graphql.GraphQLExecutor;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Component
public class CompanyGraphQLComponent {

  @PersistenceContext(unitName = "company")
  private EntityManager entityManager;

  public GraphQLExecutor graphQLExecutor() {
    return new GraphQLExecutor(entityManager);
  }
}

Можете ли вы попробовать дать аннотацию @Primary поверх entityManagerFactory и transactionManager в одном из файлов конфигурации один раз?

package p4.rest.controllers;

import core_services.persistence.CompanyContextHolder;
import core_services.records.system.Company;
import graphql.ExecutionResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import p4.CompanyGraphQLComponent;
import p4.records.GraphQLQuery;

@RestController
public class GraphQLController {
  @Autowired
  private CompanyGraphQLComponent companyGraphQLComponent;

  @RequestMapping(value = "/graphql", consumes = MediaType.APPLICATION_JSON_VALUE)
  public ExecutionResult postJson(@RequestBody GraphQLQuery graphQLQuery) {
    return companyGraphQLComponent.graphQLExecutor().execute(graphQLQuery.getQuery(), graphQLQuery.getVariables());
  }
}
person MJPearsall    schedule 07.07.2017
comment
@RossiRobinsion нет, я обновил ответ - person Rana_S; 07.07.2017
comment
Добавлен в CompanyJpaConfig и по-прежнему получаю то же исключение - person MJPearsall; 10.07.2017

У меня есть два источника данных, один из которых отмечен как основной, и проблема решена.

person T Anna    schedule 07.07.2017
comment
org.springframework.beans.factory.BeanCreationException: ошибка создания bean-компонента с именем 'graphQLExecutor': не удалось ввести зависимости ресурсов; вложенное исключение - org.springframework.beans.factory.NoUniqueBeanDefinitionException: нет подходящего bean-компонента типа 'javax.persistence.EntityManager': ожидаемый единственный соответствующий bean-компонент, но найдено 2: org.springframework.orm.jpa.SharedEntityManagerCreator. # 0 .orm.jpa.SharedEntityManagerCreator # 1 в org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues ​​(CommonAnnotationBeanPostProcessor.java:321) ~ [spring-context-4.3.9.RELEASE.jarEASE] в. springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1264) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.subscribe.com. .doCreateBean (AbstractAutowireCapableBeanFactory.java:553) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory ( AbstractAutowireCapableBeanFactory.java:483) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:306) ~ spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:230) ~ [spring-beans-4.3.9.RELEASE .jar: 4.3.9.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:302) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:197) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.beans.factory. support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:761) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.context.support.AbstractApplicationContext.fi nishBeanFactoryInitialization (AbstractApplicationContext.java:867) ~ [spring-context-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java spring:543) ~ [ -context-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.boot.context.embedded. EmbeddedWebApplicationContext.refresh (EmbeddedWebApplicationContext.java:122) ~ [spring-boot-1.5.4.RELEASE.jar: 1.5.4.RELEASE] в org.springframework.boot.SpringApplication.refresh (SpringApplication.java:693) [spring- boot-1.5.4.RELEASE.jar: 1.5.4.RELEASE] в org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:360) [spring-boot-1.5.4.RELEASE.jar: 1.5.4. RELEASE] в org.springframework.boot.SpringApplication.run (SpringApplication.java:303) [spring-boot-1.5.4.RELEASE.jar: 1.5.4.RELEASE] в org.springframework.boot.SpringApplication.run (SpringApplication .java: 1118) [spring-boot-1.5.4.RELEASE.jar: 1.5.4.RELEASE] в org.springframework.boot.SpringApplication.run (SpringApplication.java:1107) [spring-boot-1.5.4. RELEASE.jar: 1.5.4.RELEASE] в com.ogl.JpaDemoApplication.main (JpaDemoApplication.java:15) [classes /: na] Вызвано: org.springframework.beans.factory.NoUniqueBeanDefinitionException: Нет квалифицирующего bean-компонента типа ' javax.persistence.EntityM anager 'доступно: ожидаемый единственный соответствующий bean-компонент, но найдено 2: org.springframework.orm.jpa.SharedEntityManagerCreator # 0, org.springframework.orm.jpa.SharedEntityManagerCreator # 1 в org.springframework.beans.factory.configcript.DependencyDependencyDependency DependencyDescriptor.java:173) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory) ~ [spring: -beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1066) ~ [spring-beans-4.3.9.RELEASE. jar: 4.3.9.RELEASE] в org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource (CommonAnnotationBeanPostProcessor.java:518) ~ [spring-context-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResourc e (CommonAnnotationBeanPostProcessor.java:496) ~ [spring-context-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.context.annotation.CommonAnnotationBeanPostProcessor $ ResourceElement.getResourceToInjectBeans ~ CommonAnnotationBeanPostProcessor $ ResourceElement.getResourceToInject6ejs (CommonAnnotationBeanPostProcessor). [spring-context-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.beans.factory.annotation.InjectionMetadata $ InjectedElement.inject (InjectionMetadata.java:169) ~ [spring-beans-4.3. 9.RELEASE.jar: 4. 3.9.RELEASE] в org.springframework.beans.factory.annotation.InjectionMetadata.inject (InjectionMetadata.java:88) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework. context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues ​​(CommonAnnotationBeanPostProcessor.java:318) ~ [spring-context-4.3.9.RELEASE.jar: 4.3.9.RELEASE] ... 17 общих фреймов опущены - person MJPearsall; 07.07.2017

stackoverflow.com/questions/17833147/

person Gayathri Rao    schedule 20.09.2019