2012-02-20 2 views
0

Я занимаюсь разработкой отдельного компонента Java, который будет упакован как банка и добавлен в родительский проект. причина для этого как компонента заключается в том, что завтра мне, возможно, придется удалить этот код и отбросить его. Проблема, с которой я столкнулся, - это автономный компонент (jar-файл), который разрабатывается, должен запрашивать базу данных, когда кто-то вызывает свой API.Не удается создать объект Entity Manager во внешнем файле Jar

мой родительский проект настроен с использованием Spring + Hibernate + JPA.

Я не могу внедрить EntityManager из родительского проекта во внешний Jar, который создается при запуске весеннего контейнера.

Является ли это концептуально правильным? или можно сделать это таким образом?

Я хочу, чтобы файл jar просто копировал файл persistence.xml, который определяется родительским проектом и использует EntityManager, который был загружен во время запуска.

РЕДАКТИРОВАТЬ EntityManager впрыскивается через LocalContainerEntityManagerFactoryBean в главном веб-приложение таким образом

<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 в родительском веб-приложение определяется следующим образом, и аннотацию 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 в файле фляги, где я хочу EntityManage г, который будет введен таким образом, что он может использовать один уже при условии

Это ДАО в банке файл

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

    @Autowired 
    private EntityManager entityManager; 

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

Я попробовал @Autowired аннотацию и упоминает, что EntityManager фасоль Isnt настоящее.

ответ

0

Можно так же долго, как вы:

  • один и тот же Spring контекст между родительским приложением и компонентом
  • или ваш контекстом приложения является родителем вашего компонента контекста Spring.

Кроме того, вы должны убедиться, что Spring фактически создает экземпляр компонента, чтобы он мог вводить все необходимое. Если вы используете настройку на основе аннотаций, это может включать в себя сканирование компонентов (то есть вам нужно указать <context:component-scan /> в вашем applicationContext.xml). Если вы используете традиционную конфигурацию XML, должно быть достаточно <context:annotation-config />, а затем объявить ваши компоненты персистентности в applicationContext.xml.

Что определенно не работает, это использование полностью независимых контекстов для вашего родительского приложения и вашего компонента в JAR.

+0

Разделяя один и тот же контекст, вы имеете в виду, что я должен добавить оба контекста приложения в контекстное местоположение, не так ли в web.xml?Кроме того, он создает экземпляры классов jar-файлов, так как я добавил «контекст: компонент-сканирование />» в контекст родительского приложения. – Hrishikesh

+0

@Hrishikesh. Я обычно делаю это только один контекст приложения Spring, тот, который вы указываете в contextConfigLocation. Затем внутри этого контекста I '' файлы контекста из любых JAR, которые я использую. – gpeche

+0

Да, я сделал это, и он все еще не вводит Entitymanager в DAO моего jar ... Btw, EntityManager обслуживается из метода FactoryContainerEntityManagerFactoryBean, и я пытаюсь autwire Entitymanager с помощью переменной «entityManager». Должно ли это работать? потому что он дает ошибку, говоря, что никакой bean с именем Entitymanager не найден. Та же ошибка, когда вы ссылаетесь на bean-компонент, который не присутствует – Hrishikesh

Смежные вопросы