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

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());
	}
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
集成 Neo4j 数据库和 Spring Boot 2.4 及以上版本可以使用 Spring Data Neo4j 2。Spring Data Neo4j 2 是一个对象图映射框架,它提供了一种使用 Java 类来表示和操作图形数据的方法。它使用 Neo4j 的 Java 驱动程序来连接到数据库,并提供了一些方便的注释和 API,以简化与 Neo4j 的交互。 以下是在 Spring Boot 2.4 中使用 Spring Data Neo4j 2 的基本步骤: 1. 添加 Spring Data Neo4j 2 和 Neo4j 驱动程序的 Maven 依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-neo4j</artifactId> </dependency> <dependency> <groupId>org.neo4j.driver</groupId> <artifactId>neo4j-java-driver</artifactId> <version>4.2.2</version> </dependency> ``` 2. 配置 Neo4j 数据库连接信息: ```properties spring.data.neo4j.uri=bolt://localhost:7687 spring.data.neo4j.username=neo4j spring.data.neo4j.password=password ``` 3. 创建 Neo4j 实体类: ```java @Node public class Person { @Id @GeneratedValue private Long id; private String name; @Relationship(type = "FRIEND_OF", direction = Relationship.Direction.OUTGOING) private List<Person> friends; // getters and setters } ``` 4. 创建 Neo4j 存储库接口: ```java @Repository public interface PersonRepository extends Neo4jRepository<Person, Long> { List<Person> findByName(String name); } ``` 5. 在 Spring Boot 应用程序中使用 Neo4j 存储库: ```java @Autowired private PersonRepository personRepository; @Transactional public void addFriend(String name1, String name2) { Person person1 = personRepository.findByName(name1).get(0); Person person2 = personRepository.findByName(name2).get(0); person1.getFriends().add(person2); personRepository.save(person1); } ``` 以上就是在 Spring Boot 2.4 中集成 Neo4j 的基本步骤。你可以在实体类中使用注释来定义节点和关系,使用存储库接口来执行 CRUD 操作,使用 Spring Boot 的事务管理来确保数据的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值