SpringBoot2.x 集成Neo4j 提示Error creating bean with name ‘transactionManager‘ defined in class path ***

java哥 阅读:1374 2021-03-31 14:11:30 评论:0
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'transactionManager' defined in class path resource [org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.class]: Unsatisfied dependency expressed through method 'transactionManager' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.neo4j.ogm.session.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is java.lang.NullPointerException 
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) 
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:467) 
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1178) 
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1072) 
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511) 
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:481) 
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312) 
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308) 
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:220) 
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1016) 
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344) 
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:339) 
	at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:384) 
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:272) 
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
	at com.sun.proxy.$Proxy106.getStoragePath(Unknown Source)

造成的原因是Neo4j 初始化sessionFactory 没有找到Neo4j 的事务管理器 transactionManager,查看SpringBoot 2.x 涉及Neo4j 自动注入配置对象:spring-boot-autoconfigure-x.x.x.release.jar的org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration.java。

问题核心:事务接口PlatformTransactionManager实例化冲突 
 
myBatis 事务管理器实例化对象:spring-jdbc-x.x.x.release.jar  
                   实例化对象:org.springframework.jdbc.datasource.DataSourceTransactionManager.java(注意:org.springframework.transaction.support.AbstractPlatformTransactionManager 实现PlatformTransactionManager 接口) 
 
neo4j 事务管理器实例化对象:spring-data-neo4j-x.x.x.release.jar 
                   实例化对象:org.springframework.data.neo4j.transaction.Neo4jTransactionManager (注意:org.springframework.transaction.support.AbstractPlatformTransactionManager 实现PlatformTransactionManager 接口) 
 
现在的问题已经很明确 neo4j 与mybatis 事务冲突 
解决办法是:放弃springboot 自动注入neo4j 的配置服务对象:org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration.java  
 
使用spring 自定义neo4j 配置对象,核心功能代码如下:
package com.zzg.ucas.config; 
 
import org.neo4j.ogm.session.SessionFactory; 
import org.neo4j.ogm.session.transaction.DefaultTransactionManager; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories; 
 
@Configuration 
@EnableNeo4jRepositories("com.zzg.ucas.neo4j.repository") // 声明neo4j repository存放地址 
public class Neo4jConfig { 
	@Bean 
    public org.neo4j.ogm.config.Configuration getConfiguration() { 
        org.neo4j.ogm.config.Configuration config = new org.neo4j.ogm.config.Configuration(); 
        config.driverConfiguration() 
                .setDriverClassName("org.neo4j.ogm.drivers.http.driver.HttpDriver") 
                .setURI("http://neo4j:123456@192.168.0.1:7474"); 
        return config; 
    } 
	 
	@Bean(name="sessionFactory") 
    public SessionFactory getSessionFactory() { 
        /** 
         * 如果不指定节点映射的java bean路径,保存时会报如下警告,导致无法将节点插入Neo4j中 
         * ... is not an instance of a persistable class 
         */ 
        return new SessionFactory(getConfiguration(), "com.zzg.ucas.neo4j.ogm"); 
    } 
	 
	/** 
	 * 解决MyBatis 事务与Neo4j 事务冲突 
	 * @return 
	 */ 
	@Bean 
	public DefaultTransactionManager getDefaultTransactionManager(){ 
		return new DefaultTransactionManager(getSessionFactory().openSession()); 
	} 
} 

 

标签:Spring Boot
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号