2
votes

java.lang.NoSuchMethodError: javax.persistence.PersistenceContext.synchronization

Lors du déploiement de l'application sur Tomcat 8.0.36, je reçois l'exception suivante

org.springframework.beans.factory.BeanCreationException: Erreur lors de la création du bean avec le nom «eventsDAOImpl» Le post-traitement de la définition du bean fusionné a échoué; l'exception imbriquée est java.lang.NoSuchMethodError: javax.persistence.PersistenceContext.synchronization () Ljavax / persistence / SynchronizationType; à org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:560) à org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:560) à org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.AbstractAutowireCapableBeanFactory.support.AbstractAutowireCapableBeanFactory. .support. doGetBean (AbstractBeanFactory.java:310) à org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:200) à org.springframework.beans.factory.support.DefaultListableBeanFistable.getBean (AbstractBeanFactory.java:200) à org.springframework.beans.factory.support.DefaultListableBeanFistable.preFactory à org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:868) à org.sp ringframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) sur org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext (ContextLoader.java:409) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext (ContextLoader.java:409) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext (ContextLoader.java:409) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext (ContextLoader.java:409) at org.springframework.web.context. java: 291) à org.springframework.web.context.ContextLoaderListener.contextInitialized (ContextLoaderListener.java:103) à org.apache.catalina.core.StandardContext.listenerStart (StandardContext.java:4842) à org.apache.catalina.core .StandardContext.startInternal (StandardContext.java:5303) à org.apache.catalina.util.LifecycleBase.start (LifecycleBase.java:147) à org.apache.catalina.core.ContainerBase.addChildInternal (ContainerBase.java:725) à org.apache.catalina.core.ContainerBase.addChild (ContainerBase.java:701) à org.apache.catalina.core.StandardHost.addChild (StandardHost.java:717) à org.apache.catalina.startup.HostConfig.deployWAR ( HostConfig.java:940) sur org.apache.catalina.startup. HostConfig $ DeployWar.run (HostConfig.java:1816) à java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:511) à java.util.concurrent.FutureTask.run (FutureTask.java:266) à java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) à java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) à java.lang.Thread.run (Thread.java:748) Caused par: java.lang.NoSuchMethodError: javax.persistence.PersistenceContext.synchronization () Ljavax / persistence / SynchronizationType; à org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor $ PersistenceElement. (PersistenceAnnotationBeanPostProcessor.java:653) à org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor $ PersistenceElement. (PersistenceAnnotationBeanPostProcessor.java:653) à org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.lamberProcessor.lambeanProcessor.lambe16. .util.ReflectionUtils.doWithLocalFields (ReflectionUtils.java:693) à org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.buildPersistenceMetadata (PersistenceAnnotationBeanPostProcessor.java:410) à org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findPersistenceMetadata (PersistenceAnnotationBeanPostProcessor .java: 394) sur org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessMergedBeanDefinition (PersistenceAnnotationBeanPostProcessor.java:332) sur org.springframework.beans.factory.supportable.AbstractProcessable.AbstraitProcessable.AbstraitProcesseur.AbstraitProcessable.Abstrait.ProcesseurBut. eBeanFactory.java:1015) à org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:557) ... 24 plus

J'utilise eclipselink version 2.5.2 et j'ai ajouté les fichiers JAR suivants dans le dossier lib de tomcat

  1. eclipselink-2.5.2.jar
  2. javax.persistence-api-2.2.jar
  3. ojdbc6-12.1.0.1.jar

dependencies.gradle est le suivant

package javax.persistence;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PersistenceContext {
  String name() default "";

  String unitName() default "";

  PersistenceContextType type() default PersistenceContextType.TRANSACTION;

  PersistenceProperty[] properties() default {};
}

Edit 1 : La même application fonctionne correctement sur Tomcat 9 mais donne l'exception ci-dessus lors du déploiement sur Tomcat 8

Edit 2 : Après avoir fait quelques recherches, j'ai découvert que Tomcat 8 charge la classe PersistenceContext à partir d'annotations-api.jar situé dans le dossier TOMCAT_HOME \ lib au lieu de javax.persistence-api-2.2.jar et de la classe PersistenceContext disponible dans annotations-api.jar ne contient pas la méthode de synchronisation comme suit.

compile (
        'org.aspectj:aspectjrt:1.8.4',
        'org.aspectj:aspectjweaver:1.8.4',
        'org.springframework:spring-aspects:5.0.0.RELEASE',
        'org.springframework:spring-jdbc:5.0.0.RELEASE',
        'org.springframework:spring-jms:5.0.0.RELEASE',
        'org.springframework:spring-orm:5.0.0.RELEASE',
        'org.springframework:spring-oxm:5.0.0.RELEASE',
        'org.springframework:spring-web:5.0.0.RELEASE',
        'org.springframework:spring-webmvc:5.0.0.RELEASE',
        'org.springframework:spring-instrument-tomcat:4.0.9.RELEASE'
    }
    provided (
        'com.oracle:ojdbc6:12.1.0.1',
        'org.eclipse.persistence:eclipselink:2.5.2'
    )

Comment donner la préférence dans Tomcat 8 pour que Tomcat 8 charge la classe PersistenceContext à partir de javax.persistence-api-2.2.jar au lieu d'annotations-api.jar


2 commentaires

javax.persistence.PersistenceContext.synchronization () renvoie javax.persistence.SynchronizationType qui n'a été ajouté que dans JPA 2.1, vous devez donc avoir le fichier jar persistence-api antérieur dans le conteneur de manière à ce que le chargeur de classe le trouve et l'utilise à la place de votre Version 2.2.


Chris merci pour l'aide J'ai mis à jour la question. Veuillez consulter la partie modifier 2 de ma question


3 Réponses :


0
votes

peut-être que vous rencontrez des conflits dans votre version de dépendance de données de printemps Un est vesion1 (ou la réplication de deux mêmes jar, vous pouvez dire) un autre est la version2 Veuillez supprimer l'ancienne dépendance de version soit la version un, soit la version deux de pom.xml ou du chemin de construction jar

OU

peut-être qu'il n'y a pas de fichier de données Spring ou de dépendance là-bas, veuillez l'ajouter.


1 commentaires

La même application fonctionne correctement sur Tomcat 9



-1
votes

Je vois PersistenceContext.class avec la méthode synchronization() dans javax.persistence-api-2.2.jar . Il semble qu'Apache ait supprimé PersistenceContext (avec d'autres classes) de annotations-api.jar partir de Tomcat 7, ce qui signifie qu'il ne peut pas charger cette classe à partir du fichier jar fourni par Tomcat. Peut-être avez-vous un autre fichier jar dans votre application qui contient une ancienne version de PersistenceContext ?


1 commentaires

J'ai eu la même idée et j'ai ajouté java.persistence: javax.persistence-api: 2.2 au pom.xml mais RIEN DE CHANGÉ. Plus tard, j'instrument pour imprimer le chemin des ressources pour le PersistenceContext et les deux ont été chargés à partir de org.hibernate.javax.persistence: hibernate-jpa-2.0-api: 1.0.1.‌ Fiinals



0
votes

org.hibernate.javax.persistence: hibernate-jpa-2.0-api: 1.0.1.Finals fournit une ANCIENNE version de javax.persistance qui manque de cette API PersitanceContext (). synchronization ()

Solution: ajoutez java.persistence: javax.persistence-api: 2.2 AVANT hibernate-jpa-2.0-api dans le pom.xml

        <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>javax.persistence-api</artifactId>
        <version>2.2</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.0-api</artifactId>
        <version>1.0.1.Final</version>
    </dependency>

Aucune idée de gradle, mais au moins vous pouvez essayer.


0 commentaires