2010-05-26 24 views
1

Je viens de commencer à étudier Spring framework. Mon objectif actuel est d'accéder à la base de données de mon bean via JPA (fournisseur TopLink **) sur le serveur Geronimo. Mais je ne peux pas surmonter le problème d'obtention entityManagerFactory.Impossible de récupérer "entityManagerFactory" en utilisant Geronimo

L'exception que je reçois:

java.lang.IllegalStateException: ClassLoader [org.apache.geronimo.kernel.config.MultiParentClassLoader] ne fournit pas un 'addTransformer (ClassFileTransformer)' méthode. Spécifiez une coutume LoadTimeWeaver ou démarrer votre machine virtuelle Java avec l'agent de printemps: -javaagent: printemps-agent.jar

La façon dont j'accéder:

<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 /> 

Je serai très reconnaissant si n'importe qui peut m'aider sans utiliser l'option "-javaagent: spring-agent.jar".


Recherche d'une solution. Premier essai. Après "axtavt" advice, j'ai trouvé un exemple de spécification de chargeur de classe spéciale pour votre application web sur Tomcat. Il utilise le fichier context.xml à cette fin. Bien que mon Geronimo utilise Tomcat, je n'ai pas réussi à implémenter context.xml. Comme il est dit dans la prochaine manual l'alternative pour context.xml pour Geronimo est geronimo-tomcat.xml, mais sa syntaxe ne fournit aucune possibilité de changer classloader. J'ai encore besoin d'aide!


Répondre

1

Le lien supérieur nécessite un support de tissage à temps de chargement. Je suppose que dans Geronimo, il peut être configuré en utilisant META-INF/context.xml et en mettant jar instrumentation dans le dossier lib, comme dans Tomcat, voir here.

EDIT: Donc, votre problème est que Toplink nécessite une prise en charge de la transformation de classe. Lorsque le gestionnaire d'entités de Toplink est configuré dans la configuration de Spring (LocalContainerEntityManagerFactoryBean), il essaie d'utiliser le support de Spring pour la transformation de classe (<context:load-time-weaver />), mais Spring ne dispose pas d'un support intégré pour la transformation de classe dans Geronimo. Donc, vous avez 3 options:

  1. Utilisation implémentation JPA qui ne nécessite pas de transformation de classe au lieu de Toplink (par exemple, Hibernate)
  2. Ne pas configurer le gestionnaire d'entités de Toplink dans le fichier de configuration Spring. Configurez-le en utilisant la configuration de Geronimo (je ne sais pas comment) et obtenez-le en utilisant JNDI.
  3. Pour les maniaques: Implémentez un LoadTimeWeaver personnalisé pour Geronimo (je suppose qu'il utilisera TransformerAgent.addTransformer()).
+0

Salut, il semble que ce soit la bonne façon, mais je n'ai pas trouvé d'alternative pour context.xml. J'ai mis à jour ma question. – Denis

+0

@Denis: Réponse éditée. – axtavt

+0

Bonjour! J'ai une question à cause de l'utilisation d'Hibernate. Où puis-je trouver la classe "org.hibernate.ejb.HibernatePersistence"? J'ai décidé d'utiliser maven et de placer l'artefact suivant comme dépendance "org.hibernate: hibernate-entitymanager". Maven a ajouté trois jars liés à hibernate à mon projet. Deux d'entre eux sont connectés à l'aide d'annotations et le troisième est le noyau, mais aucun d'eux ne contient la classe requise "org.hibernate.ejb.HibernatePersistence". Les instructions que j'ai suivies: http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/configuration.html – Denis