2012-02-20 42 views
0

我正在开发一个独立的java组件,该组件将被打包为jar并添加到父项目中。将其作为组件的原因是因为明天我可能必须删除该代码并丢弃它。 我面临的问题是独立组件,(正在开发的jar文件)需要在有人调用其API时查询数据库。无法在外部Jar文件中注入实体管理器

我的父项目是使用Spring + Hibernate + JPA设置的。

我无法从父项目注入EntityManager到弹簧容器启动期间实例化的外部Jar中。

这在概念上是正确的吗?还是有可能以这种方式做到这一点?

我希望jar文件只是在由父项目定义的persistence.xml上使用,并使用在启动过程中加载的EntityManager。

EDIT 了EntityManager通过LocalContainerEntityManagerFactoryBean注入在主web应用以这种方式

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSourceWrapper" /> 
    <property name="persistenceUnitName" value="LineManagement" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="generateDdl" value="false" /> 
      <property name="showSql" value="false" /> 
      <property name="databasePlatform" value="${hibernate.dialect}" /> 
     </bean> 
    </property> 
    <property name="beanName" value="entityManager"></property> 
</bean> 

的AbstractDao的在以下面的方式被定义父web应用,并且PersistenceContext注解确实给后面的EntityManager和一切工作正常..

public abstract class AbstractDAO<T extends LMEntity> { 

    @PersistenceContext(unitName = "LineManagement") 
    protected EntityManager entityManager; 

    @Autowired 
    private DataSource dataSource; 

    @Autowired 
    private DAOSupport daoSupport; 

    public void initHibernateStatistics() { 
     HibernateStatistics.enableHibernateStatistics(entityManager); 
    } 

下面是DAO的jar文件,我想要的EntityManage R键被注入,以便它可以使用已经提供

这是jar文件

@Repository(value = "retryDAO") 
public class RetryDAOImpl 
    implements RetryDAO { 

    @Autowired 
    private EntityManager entityManager; 

    @Transactional 
    public void saveEvent(final IntegrationEvent event) { 
     entityManager.merge(event); 
    } 

的DAO我尝试了@Autowired注解之一,它提到了EntityManager豆心不是存在。

回答

0

只要有可能为你:

  • 份额父应用程序和组件之间的相同Spring上下文
  • 或您的应用程序上下文是组件Spring上下文的父。

此外,您需要确保Spring确实实例化您的组件,以便它可以注入任何必需的东西。如果您使用基于注释的配置,则可能涉及组件扫描(即,您需要在applicationContext.xml中指定<context:component-scan />)。如果您使用传统的XML配置,则<context:annotation-config />然后在applicationContext.xml中声明持久性组件应该足够了。

什么绝对不会工作是在您的父应用程序和您的组件在JAR中使用完全独立的上下文。

+0

通过共享相同的上下文,您的意思是我应该将这两个应用程序上下文添加到contextConfig位置不是它在web.xml中?另外,它还实例化了jar文件类,因为我已经在父应用上下文中添加了'' – Hrishikesh 2012-02-21 01:01:32

+0

@Hrishikesh我通常做的是只有一个Spring应用程序上下文,的contextConfigLocation。然后在这个上下文中,我使用我所使用的任何JAR的''上下文文件。 – gpeche 2012-02-21 16:18:24

+0

是的,我这样做,它仍然没有注入Entitymanager在我的jar的DAO ...顺便说一句,EntityManager是从LocalContainerEntityManagerFactoryBean工厂方法服务的,我尝试使用“entityManager”变量自动调用Entitymanager。这应该工作吗?因为它给出了一个错误,说没有找到名为Entitymanager的bean。多数民众赞成在同样的错误,当你提到一个豆没有目前 – Hrishikesh 2012-02-21 17:15:29

相关问题