Не удалось получить "entityManagerFactory" с помощью Geronimo
Я только начал изучать Spring Framework. Моя текущая цель - получить доступ к базе данных из моего бина через JPA (поставщик TopLink**) на сервере Geronimo. Но я не могу преодолеть проблему получения entityManagerFactory.
Исключение я получаю:
java.lang.IllegalStateException: ClassLoader [org.apache.geronimo.kernel.config.MultiParentClassLoader] НЕ предоставляет метод addTransformer(ClassFileTransformer)'. Укажите пользовательский LoadTimeWeaver или запустите виртуальную машину Java с агентом Spring: -javaagent:spring-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", я нашел пример указания специального загрузчика классов для вашего веб-приложения на Tomcat. Для этого он использует файл context.xml. Хотя мой Geronimo использует Tomcat, мне не удалось реализовать context.xml. Как сказано в следующем руководстве, альтернативой context.xml для Geronimo является geronimo-tomcat.xml, но его синтаксис не предоставляет никаких возможностей для изменения загрузчика классов. Мне все еще нужна помощь!
1 ответ
Toplink требует поддержки ткачества во время загрузки. Я думаю, в Geronimo это можно настроить с помощью META-INF/context.xml
и положить банку с инструментами в lib
папку, как в Tomcat, смотрите здесь.
РЕДАКТИРОВАТЬ: Итак, ваша проблема в том, что Toplink требует поддержки преобразования классов. Когда менеджер сущностей Toplink настроен в конфигурации Spring (LocalContainerEntityManagerFactoryBean
), он пытается использовать поддержку Spring для преобразования классов (<context:load-time-weaver />
), но Spring не имеет встроенной поддержки преобразования классов в Geronimo. Итак, у вас есть 3 варианта:
- Используйте реализацию JPA, которая не требует преобразования классов вместо Toplink (например, Hibernate)
- Не настраивайте менеджер сущностей Toplink в конфигурационном файле Spring. Настройте его, используя конфигурацию Geronimo (я не знаю, как), и получите его, используя JNDI.
- Для маньяков: Реализуйте пользовательский LoadTimeWeaver для Geronimo (я думаю, он будет использовать
TransformerAgent.addTransformer()
).