Не удалось получить «entityManagerFactory» с помощью Geronimo - PullRequest
1 голос
/ 26 мая 2010

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

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

java.lang.IllegalStateException: ClassLoader [Org.apache.geronimo.kernel.config.MultiParentClassLoader] НЕ предоставляет 'AddTransformer (ClassFileTransformer)' метод. Укажите кастом LoadTimeWeaver или запустите Java виртуальная машина с агентом Spring: -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 Ответ

1 голос
/ 26 мая 2010

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()).
...