2

My app can't autowire entityManagerFactory.

My applicationContext.xml:

<tx:annotation-driven/>
<context:component-scan base-package="top.level.package" />

<bean id="persistenceUnitManager"     
    class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
    <property name="persistenceXmlLocation">
        <value>classpath:jpa-persistence.xml</value>
    </property>
</bean>

<bean id="entityManagerFactory"      
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitManager" ref="persistenceUnitManager" />
</bean>

<bean id="transactionManager" 
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

My java class:

@Component
public class Engine {

    @Autowired
    @Qualifier("entityManagerFactory")
    private EntityManagerFactory entityManagerFactory;
......
}

Question:

Why entityManagerFactory is null?

4

3 回答 3

4

要让 spring 使用注释进行 autowring,您必须告诉 spring。在您的 xml 配置中(假设您还没有context:component-scan元素)添加一个context:annotation-config. 这将指示 spring 应用程序上下文扫描注释(如@Autowired@Inject@Resource)以进行自动装配。

还要确保您希望EntityManagerFactory注入的类(Engine类)是弹簧管理的 bean。Spring 只会将引用注入到 Spring 托管的 bean 中。

于 2013-08-24T08:09:16.627 回答
2

你试过这个吗?

private EntityManagerFactory entityManagerFactory;

@Autowired
@PersistenceUnit(unitName = "myUnitName")
public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
    this.entityManagerFactory = entityManagerFactory;
}

前段时间我遇到了同样的错误,我发现这是一个解决方案。

于 2013-08-23T21:08:17.207 回答
0

如果您创建您的Enginewith new Engine()(如您的评论之一所述),则它不是由 Spring 管理的。@Component然后没有效果,并且不会注入依赖项。你需要注入你的引擎。

于 2013-08-24T09:37:33.110 回答