【问题标题】:Spring Java Configuration No bean named 'entityManagerFactory' is definedSpring Java 配置没有定义名为“entityManagerFactory”的bean
【发布时间】:2013-11-19 17:56:01
【问题描述】:

我花了一天时间试图弄明白,最终不得不求助于 stackoverflow 寻求专家建议。

我正在使用 java 设置 spring 配置以具有两个数据源和两个 LocalContainerEntityManagerFactoryBean,如下所示。但默认情况下,Spring 似乎寻找 entityManagerFactory() 并抛出异常(包括下面的堆栈跟踪)。如何配置 spring 以使用我的 entitymanagerfactories 而不是默认名称。

@Bean(name="visionDataSource")
public DataSource visionDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    // set properties..
    return dataSource;
}

@Bean(name="stormDataSource")
public DataSource visionDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    // set properties..
    return dataSource;
}

  @Bean(name="visionentityManagerFactory")
public LocalContainerEntityManagerFactoryBean visionentityManagerFactory() {
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    entityManagerFactoryBean.setDataSource(visionDataSource());
    //entityManagerFactoryBean.setPersistenceUnitManager(persistenceUnitManager());
    //entityManagerFactoryBean.setPersistenceXmlLocation(null);
    entityManagerFactoryBean.setPersistenceUnitName("visionEntityManagerFactory");
    entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class);
    entityManagerFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
    entityManagerFactoryBean.setJpaProperties(hibProperties());
    entityManagerFactoryBean.afterPropertiesSet();
    System.out.println("*********************visionEntityManagerFactory********************");
    return entityManagerFactoryBean;
}

 @Bean(name="stormEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean stormEntityManagerFactory() {
    entityManagerFactoryBean.setDataSource(stormDataSource());
    // set other properties
    return entityManagerFactoryBean;
  }

错误日志:

原因:org.springframework.beans.factory.BeanCreationException:创建名为“(内部bean)#1”的bean时出错:在设置构造函数参数时无法解析对bean“entityManagerFactory”的引用;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:329) 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107) 在 org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:616) 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:441) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1015) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:911) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:271) ... 51 更多

原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为“entityManagerFactory”的bean 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:549) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1095) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:277) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:323) ... 59 更多

更新:我正在使用 JPARepository

  public interface ContactRepository extends JpaRepository<Contact, Serializable> {
    List<Contact> findByCompanyId(int companyId);
  }

我已经尝试扩展自定义存储库注入实体管理器,如下所示。但这也无济于事。

  public interface ContactRepository extends DefaultRepository<Contact, Serializable> {
    List<Contact> findByCompanyId(int companyId);
   }

@NoRepositoryBean
public class DefaultRepositoryImpl<T, ID extends Serializable> extends SmpleJpaRepository<T, ID> implements 
                        DefaultRepository<T,ID> {

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

/**
 * @param domainClass
 * @param em
 */
 public DefaultRepositoryImpl(Class<T> domainClass, EntityManager em) {
 super(domainClass, em);
 }

 /**
  * {@inheritDoc}
  */
 protected Object getTargetRepository(RepositoryMetadata metadata) {
     return new DefaultRepositoryImpl<T, ID>((Class<T>) metadata.getDomainType(), entityManager);
 }
 /**
  * {@inheritDoc}
  */
 protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
     return DefaultRepository.class;
     }
  }

【问题讨论】:

  • 您能从您的数据访问类/存储库中发布一些代码吗?问题将是其中一个尝试注入 entityManagerFactory 而不是您的替代命名的 bean。
  • 我正在使用 JPARepository。在我的帖子中添加了代码 sn-p。

标签: spring configuration spring-data entitymanager spring-data-jpa


【解决方案1】:

一种可能的解决方案。

public class MyRepositoryImpl extends JdbcDaoSupport implements MyRepository {

    @Qualifier("odsDataSource")
    @Autowired(required = true)
    private DataSource ds;

    public MyRepositoryImpl() {
    }

    @PostConstruct
    void postConstruct() {
        setDataSource(ds);
    }

    ...
}

如果您通过扩展 JdbcDaoSupport(以及其他一些 Spring 提供的帮助程序)来开发存储库,那么它们将默认尝试在默认的“entityManagerFactory”上按名称进行连接。因此,您需要通过注入您的备用数据 bean 来初始化它们。

假设您使用 JPA 的另一种可能性。

@Repository
public class MyRepositoryImpl implements MyRepository {
    @PersistenceContext(unitName="MyPersistenceUnit")
    private EntityManager entityManager;

    public List<MyModel> findAll() {
        return entityManager.createNamedQuery("MyModel.findAll").getResultList();
    }
}

更新:对于最近遇到这个问题的人,使用 Spring Boot 和 Spring Data JPA,我写了一篇博客文章,介绍了使其正常工作的要点:http://scattercode.co.uk/2016/01/05/multiple-databases-with-spring-boot-and-spring-data-jpa/

【讨论】:

  • 我们是否可以有一个自定义的仓库并扩展到我所有的仓库,以避免为所有仓库编写实现类。我在帖子中添加了一些代码来拥有自定义存储库。我不确定我的做法是否正确。
  • 我想说尝试在您的存储库接口上使用 @PersistenceContext 注释。虽然我找不到任何文档,所以我不能保证任何事情。 :-/
  • 请问您找到解决方案了吗?我有完全相同的问题。谢谢。
  • 我现在有一个可以添加的解决方案,如果您是这个意思,可以使用 Spring Data JPA...
猜你喜欢
  • 2022-01-19
  • 2015-04-17
  • 2014-02-26
  • 1970-01-01
  • 2019-03-16
  • 2015-08-30
  • 2017-11-14
  • 2016-01-02
  • 2019-01-27
相关资源
最近更新 更多