2010-05-26 4 views
1

Я только что начал изучать Spring framework. Моя текущая цель - получить доступ к базе данных из моего компонента через JPA (поставщик TopLink **) на сервере Geronimo. Но я не могу решить проблему получения entityManagerFactory.Не удалось получить «entityManagerFactory» с помощью Geronimo

Исключение я получаю:

java.lang.IllegalStateException: ClassLoader [org.apache.geronimo.kernel.config.MultiParentClassLoader] не обеспечивает 'addTransformer (ClassFileTransformer)' метод. Укажите пользовательские LoadTimeWeaver или запустить Java виртуальную машину с агентом Спринга: -javaagent: весна-agent.jar

так, как я к нему доступ:

<context:load-time-weaver /> 

    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceXmlLocation" value="classpath:/META-INF/persistence.xml" /> 
    </bean> 

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 
    <bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 
    <tx:annotation-driven /> 

Я буду очень признателен, если любой может помочь мне, не используя параметр «-javaagent: spring-agent.jar».


Поиск решения. Первая попытка.

После «axtavt» advice я нашел пример указания специального загрузчика классов для вашего веб-приложения на Tomcat. Он использует context.xml файл для этой цели. Хотя мой Geronimo использует Tomcat, мне не удалось реализовать context.xml. Как сказано в следующем manual альтернативой для context.xml для Geronimo является geronimo-tomcat.xml, но его синтаксис не предоставляет возможности для изменения загрузчика классов. Мне все еще нужна помощь!


ответ

1

Toplink требует поддержки ткачества со временем загрузки. Я предполагаю, что в Geronimo его можно настроить с помощью META-INF/context.xml и поставить измерительную банку в папку lib, как в Tomcat, см. here.

EDIT: Итак, ваша проблема заключается в том, что Toplink требует поддержки преобразования классов. Когда диспетчер сущностей Toplink настроен в конфигурации Spring (LocalContainerEntityManagerFactoryBean), он пытается использовать поддержку Spring для преобразования класса (<context:load-time-weaver />), но Spring не имеет встроенной поддержки преобразования классов в Geronimo. Таким образом, у вас есть 3 варианта:

  1. реализации Использование JPA, которые не требуют класса преобразований вместо Toplink (например, Hibernate)
  2. Не настраивайте диспетчер сущностей TOPLINK в в файле конфигурации Spring. Настройте его с помощью конфигурации Geronimo (я не знаю как) и получаю ее с помощью JNDI.
  3. Для маньяков: Внесите обычай LoadTimeWeaver для Geronimo (я думаю, он будет использовать TransformerAgent.addTransformer()).
+0

Привет, это кажется правильным, но я не нашел альтернативы для context.xml. Я обновил свой вопрос. – Denis

+0

@Denis: Ответ отредактирован. – axtavt

+0

Привет! У меня вопрос из-за использования Hibernate. Где я могу найти класс org.hibernate.ejb.HibernatePersistence? Я решил использовать maven и разместить после артефакта в качестве зависимости «org.hibernate: hibernate-entitymanager». Maven добавил к моему проекту три спящего режима. Два из них связаны с использованием аннотаций, а третий - ядром, но ни один из них не содержит требуемого класса «org.hibernate.ejb.HibernatePersistence». Последующие инструкции: http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/configuration.html – Denis