2012-02-20 77 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

相關問題