2016-04-05 10 views
1

Zunächst in unserem Projekt verwendeten wir Frühling 3 + Winterschlaf 3 Vor kurzem wurde beschlossen, 3rd Party Gläser, als Teil zu aktualisieren von dieser Quelle auf 4 erhöht, aber nicht überwintert (immer noch Winterschlaf 3 wird beibehalten). Jetzt haben wir keinen Code für Spring 4 Upgrade geändert und wenn wir Projekt LocalContainerEntityManagerFactoryBean ausführen, ist die Injektion fehlgeschlagen. Ich habe Context File Deklaration & Fehler Stack-Trace in unten angegeben. Jetzt die Frage ist, wie kann ich bestehende Projektarbeiten an Frühling 4 ohne Aktualisierung Hibernate machen.org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean schlägt nach der Aktualisierung von Spring-Orm jar auf 4.1.6

Mit Spring ORM 4.1.6 LocalContainerEntityManagerFactoryBean versucht, JPA 2.0 spezifische Hibernate-Importe (dh 4 Klassen im Hibernate) zu laden und schlägt fehl.

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 

    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/> 
    <property name="persistenceUnitName" value="casp-portal"/> 
</bean> 
<!-- Transaction manager for a single JPA EntityManagerFactory (alternative to JTA --> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 
    <!-- enable the configuration of transactional behavior based on annotations --> 
<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

Fehler-Stack-Trace

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [applicationContext-securityEJB-DBtest.xml]: Post-processing failed of bean type [class org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] failed; nested exception is java.lang.IllegalStateException: Failed to introspect bean class [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] for persistence metadata: could not find class that it depends on at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:936) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:93) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) ... 11 more Caused by: java.lang.IllegalStateException: Failed to introspect bean class [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] for persistence metadata: could not find class that it depends on at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:396) at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(PersistenceAnnotationBeanPostProcessor.java:333) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:931) ... 44 more Caused by: java.lang.NoClassDefFoundError: javax/persistence/ValidationMode at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2615) at java.lang.Class.getDeclaredMethods(Class.java:1860) at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.buildPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:420) at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:392) ... 46 more Caused by: java.lang.ClassNotFoundException: javax.persistence.ValidationMode at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 51 more

Antwort

0

Technologies, die derzeit in dem Projekt: Hibernate 3 + mit dem letzten Tech-Stack-Upgrade bekam Spring Version 4.1 geändert. Spring 4.1 ist gezwungen JPA 2.0 zu verwenden, während es rückwärts unterstützt, was bedeutet, dass JPA 1.0 unterstützt wird, siehe unten, Beschreibung von Spring Site.

Java EE version 6 or above is now considered the baseline for Spring Framework 4, with the JPA 2.0 and Servlet 3.0 specifications being of particular relevance. In order to remain compatible with Google App Engine and older application servers, it is possible to deploy a Spring 4 application into a Servlet 2.5 environment. However, Servlet 3.0+ is strongly recommended and a prerequisite in Spring’s test and mock packages for test setups in development environments.

Aktuelle Ausgabe: JUnit-Testfällen versagen während bean Injektionszeit unten hervorgehoben. LocalContainerEntityManagerFactoryBean, das Spring-ORM-Klassen erweitert, versucht JPA 2.0-spezifische Hibernate-Importe zu laden und schlägt fehl.

<bean id="entityManagerFactory" 
    class="com.abc.persist.LocalContainerEntityManagerFactoryBean"> 

    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-security.xml"/> 
    <property name="persistenceUnitName" value="casp-portal"/> 
    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="javax.persistence.sharedCache.mode" value="none" /> 
     </map> 
     </property> 
</bean> 
<!-- Transaction manager for a single JPA EntityManagerFactory (alternative to JTA --> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 
    <!-- enable the configuration of transactional behavior based on annotations --> 
<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

Lösungen:

  1. Option I: die alte Version von Spring-ORM Halten Sie es wie funktioniert [Dies ist, was wir derzeit als Arbeit zu tun um ].

    Option II: Kopieren Sie 3,4 Spring-Orm-Java-Klassen in unser Projekt und optimieren Sie den Spring-Klassen-Code nach unseren Bedürfnissen [Ich plane, dies zu implementieren].

  2. Option III: Dies ist in der Forschung, versuchen, eine andere alternative Möglichkeit zu finden, EntityManager zu injizieren.