我正在尝试使用多个数据源配置Spring Boot 1.5.9项目,其中一些是Neo4j。 我正在使用的spring-data-neo4j的版本是4.2.9。
我的目标是为不同的存储库使用不同的SessionFactory,为每个存储库使用不同的Configuration类。
我已经将这一切都与Mongo一起工作了,但似乎即使sessionFactoryRef在@ EnableNeo4jRepositories上可用,也很简单,不会对它采取行动。
我的配置的缩写版本,包含一般概念:
@org.springframework.context.annotation.Configuration
@EnableNeo4jRepositories(basePackages = "<repo-package-name>", sessionFactoryRef = NEO4J_SESSIONFACTORY_NAME)
public class MyConfiguration {
protected static final String NEO4J_SESSIONFACTORY_NAME = "mySessionFactory";
@Bean(NEO4J_SESSIONFACTORY_NAME)
public SessionFactory mySessionFactory() {
SessionFactory sessionFactory = ...
// passing entity package corresponding to repository
return sessionFactory;
}
如前所述,这个结构可以正常使用spring-data-mongodb,但是在neo4j中它首先出现错误:
***************************
APPLICATION FAILED TO START
***************************
Description:
A component required a bean named 'getSessionFactory' that could not be found.
Action:
Consider defining a bean named 'getSessionFactory' in your configuration.
在记录器中启用debug并查看代码导致我SessionBeanDefinitionRegistrarPostProcessor,其中包含以下代码以获取sessionFactory:
private static String getSessionFactoryBeanRef(ConfigurableListableBeanFactory beanFactory) {
return beanFactory.containsBeanDefinition("sessionFactory") ? "sessionFactory" : "getSessionFactory";
}
嗯... bean的硬编码名称,没有可定制性的迹象。
然后我继续命名我的bean两次,@Bean("sessionFactory", NEO4J_SESSIONFACTORY_NAME)
,所以上面的代码会通过。
应用程序已启动,但问题是存储库与所谓的sessionFactory
bean连接,实际上没有在注释上使用sessionFactoryRef
。
为了测试这一点,我将注释上的名称更改为不存在的bean并继续启动(如果我使用mongo-annotation执行此操作,则应用程序退出,因为mongoTemplateRef中提到的bean不可用)
我挖了一点,发现,对于mongo,它在this class中检索bean引用。 equivalent neo4j implementation没有这样的事情。它当然可以是一个实现细节,但除了注释和xml架构之外,我无法找到对sessionFactoryRef
属性的任何引用。
配置类中还有other个地方,只有一个SessionFactory可用。
因此,简而言之,在我看来EnableNeo4jRepositories.sessionFactoryRef
没有实现,因此简单不做任何事情。
因此,使用当前代码,必须存在单个bean“sessionFactory”,并且无论sessionFactoryRef的值如何,所有存储库都将与此bean连接。
其他有类似经历的人还是知道如何为此提交错误?