2017-01-17 4 views
1

С JPA в Spring4, я хотел бы определить default TransactionManager, так что в моем @Configuration классе я реализует интерфейс TransactionManagementConfigurer и Переопределить метод annotationDrivenTransactionManager --- это вернуть JPA-TX. Но когда я начинаю мое приложение я получил запутанную Ошибку:Почему JPA + TransactionManagementConfigurer не работает

2017-02-14 15:00:19.108 [localhost-startStop-1] ERROR org.springframework.web.context.ContextLoader - Context initialization failed 
java.lang.NoClassDefFoundError: org.springframework.beans.FatalBeanException 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:368) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1127) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1022) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1054) ~[spring-context-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:829) ~[spring-context-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444) ~[spring-web-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326) [spring-web-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) [spring-web-4.2.8.RELEASE.jar:4.2.8.RELEASE] 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4937) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_45] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_45] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_45] 
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_45] 

Что делает java.lang.NoClassDefFoundError: org.springframework.beans.FatalBeanException значит.

Это класс конфигурации:

@Configuration 
@EnableJpaRepositories(basePackages = {"cn.madmind.config"}) 
@EnableTransactionManagement 
@ComponentScan(basePackages = {"cn.madmind.config"}) 
public class RootApplicationConfig implements TransactionManagementConfigurer { 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource datasource = new DriverManagerDataSource(); 
     datasource.setDriverClassName("com.mysql.jdbc.Driver"); 
     datasource.setUrl("jdbc:mysql://localhost:3306/alioth"); 
     datasource.setUsername("root"); 
     datasource.setPassword(""); 
     return datasource; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() { 
     JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(); 
     jpaTransactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
     return jpaTransactionManager; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); 
     adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect"); 
     factory.setJpaVendorAdapter(adapter); 
     factory.setDataSource(dataSource()); 
     factory.setPackagesToScan("cn.madmind.config"); 
     return factory; 
    } 

    /** 
    * set default transaction-manager 
    */ 
    @Override 
    public PlatformTransactionManager annotationDrivenTransactionManager() { 
     return transactionManager(); 
    } 
} 

ответ

0

Возможно, это ошибка в самом Spring Framework: https://jira.spring.io/browse/SPR-10787

Я столкнулся с аналогичной проблемой в настоящее время, хотя, в версиях рамки, которые теоретически исправлено (4.1.9.RELEASE и 4.3.9.RELEASE), поэтому ваше перемещение может отличаться.

Edit: Похоже, наш проект был некоторое сомнительным вокруг @Imported автоматического связывания @Configuration, (несколько поддельно статических методов боба фабрики, и непосредственно autowired поля), которые вылетали для старых версий Spring, но сломали при попытке обновления.

Упорядочить это, немного отвлекаясь от беспокойства, гарантируя, что я делал конструкторную инъекцию конфигурационных файлов, таких как документы: http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html исправил это для меня.

Смежные вопросы