带有@EnableExperimentalNeo4jRepositories 注释和 SpringBoot 1.4.2 的 NoUniqueBeanDefinitionException
NoUniqueBeanDefinitionException with @EnableExperimentalNeo4jRepositories annotation and SpringBoot 1.4.2
我遇到 Spring 启动 1.4.2.M1 和 @EnableExperimentalNeo4jRepositories 的问题。
好像是两个bean冲突,一个spring boot,一个spring-data-neo4j。
这是堆栈跟踪摘录:
18:12:15.891 [main] DEBUG o.s.b.d.LoggingFailureAnalysisReporter - Application failed to start due to an exception
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.neo4j.ogm.session.Session' available: expected single matching bean but found 2: getSession,org.springframework.data.neo4j.transaction.SharedSessionCreator#0
还有一个……
Parameter 0 of method setSession in org.springframework.data.neo4j.repository.support.Neo4jRepositoryFactoryBean required a single bean, but 2 were found:
- getSession: defined in BeanDefinition defined in class path resource [org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration$SpringBootNeo4jConfiguration.class]
- org.springframework.data.neo4j.transaction.SharedSessionCreator#0: defined by method 'createSharedSession' in null
有人知道如何解决这个问题吗?
下面是我的 Neo4j 配置
package com.domain.core.context;
import javax.annotation.PostConstruct;
import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory;
import org.neo4j.ogm.session.event.Event;
import org.neo4j.ogm.session.event.EventListenerAdapter;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.neo4j.repository.config.EnableExperimentalNeo4jRepositories;
import org.springframework.data.neo4j.transaction.Neo4jTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Configuration
@ComponentScan("com.domain")
@EnableExperimentalNeo4jRepositories(basePackages = "com.domain.core.repository")
@EnableTransactionManagement
@SpringBootApplication(exclude = Neo4jDataAutoConfiguration.class)
public class TestPersistenceContext {
@PostConstruct
public void init() {
log.info("TheScene.Co: Initializing Test Neo4jConfig ...");
}
@Bean
public Neo4jTransactionManager transactionManager() throws Exception {
return new Neo4jTransactionManager(sessionFactory());
}
@Bean
public SessionFactory sessionFactory() {
return new SessionFactory(getConfiguration(), "com.domain") {
@Override
public Session openSession() {
Session session = super.openSession();
session.register(new EventListenerAdapter() {
@Override
public void onPreSave(Event event) {
// do something - like set an id on an object
log.debug("***** Saving domain object ********");
}
});
return session;
}
};
}
@Bean
public org.neo4j.ogm.config.Configuration getConfiguration() {
org.neo4j.ogm.config.Configuration config = new org.neo4j.ogm.config.Configuration();
config.driverConfiguration().setCredentials("neo4j", "password")
.setDriverClassName("org.neo4j.ogm.drivers.http.driver.HttpDriver");
return config;
}
}
您必须使用 Spring Data Neo4j (SDN) 版本 4.2.0.M1
。发布这个里程碑版本是为了从 4.1.x
获得对几个重大变化的反馈。
SDN 4.2.0.RC1
应该在本周晚些时候发布,但目前 4.2.0.BUILD-SNAPSHOT
实际上在 Ingalls
12 月 Spring 数据发布之前相当稳定.
I have written a guide 对于来自 SDN 4.0
/4.1
的用户,其中介绍了如何升级到快照版本。
在本指南中 there is a link 到一个示例项目分支,该分支展示了如何使此版本与 Spring 引导 1.4.x
一起工作,并进行一些小的变通。
在即将发布的 Spring Boot 1.5
中,我们更新了所有自动配置以直接与 SDN 4.2
一起工作。我们将更新 Spring 引导接近发布的文档。
我遇到 Spring 启动 1.4.2.M1 和 @EnableExperimentalNeo4jRepositories 的问题。
好像是两个bean冲突,一个spring boot,一个spring-data-neo4j。
这是堆栈跟踪摘录:
18:12:15.891 [main] DEBUG o.s.b.d.LoggingFailureAnalysisReporter - Application failed to start due to an exception
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.neo4j.ogm.session.Session' available: expected single matching bean but found 2: getSession,org.springframework.data.neo4j.transaction.SharedSessionCreator#0
还有一个……
Parameter 0 of method setSession in org.springframework.data.neo4j.repository.support.Neo4jRepositoryFactoryBean required a single bean, but 2 were found:
- getSession: defined in BeanDefinition defined in class path resource [org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration$SpringBootNeo4jConfiguration.class]
- org.springframework.data.neo4j.transaction.SharedSessionCreator#0: defined by method 'createSharedSession' in null
有人知道如何解决这个问题吗?
下面是我的 Neo4j 配置
package com.domain.core.context;
import javax.annotation.PostConstruct;
import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory;
import org.neo4j.ogm.session.event.Event;
import org.neo4j.ogm.session.event.EventListenerAdapter;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.neo4j.repository.config.EnableExperimentalNeo4jRepositories;
import org.springframework.data.neo4j.transaction.Neo4jTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Configuration
@ComponentScan("com.domain")
@EnableExperimentalNeo4jRepositories(basePackages = "com.domain.core.repository")
@EnableTransactionManagement
@SpringBootApplication(exclude = Neo4jDataAutoConfiguration.class)
public class TestPersistenceContext {
@PostConstruct
public void init() {
log.info("TheScene.Co: Initializing Test Neo4jConfig ...");
}
@Bean
public Neo4jTransactionManager transactionManager() throws Exception {
return new Neo4jTransactionManager(sessionFactory());
}
@Bean
public SessionFactory sessionFactory() {
return new SessionFactory(getConfiguration(), "com.domain") {
@Override
public Session openSession() {
Session session = super.openSession();
session.register(new EventListenerAdapter() {
@Override
public void onPreSave(Event event) {
// do something - like set an id on an object
log.debug("***** Saving domain object ********");
}
});
return session;
}
};
}
@Bean
public org.neo4j.ogm.config.Configuration getConfiguration() {
org.neo4j.ogm.config.Configuration config = new org.neo4j.ogm.config.Configuration();
config.driverConfiguration().setCredentials("neo4j", "password")
.setDriverClassName("org.neo4j.ogm.drivers.http.driver.HttpDriver");
return config;
}
}
您必须使用 Spring Data Neo4j (SDN) 版本 4.2.0.M1
。发布这个里程碑版本是为了从 4.1.x
获得对几个重大变化的反馈。
SDN 4.2.0.RC1
应该在本周晚些时候发布,但目前 4.2.0.BUILD-SNAPSHOT
实际上在 Ingalls
12 月 Spring 数据发布之前相当稳定.
I have written a guide 对于来自 SDN 4.0
/4.1
的用户,其中介绍了如何升级到快照版本。
在本指南中 there is a link 到一个示例项目分支,该分支展示了如何使此版本与 Spring 引导 1.4.x
一起工作,并进行一些小的变通。
在即将发布的 Spring Boot 1.5
中,我们更新了所有自动配置以直接与 SDN 4.2
一起工作。我们将更新 Spring 引导接近发布的文档。