Не удалось получить "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 варианта:

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