我正在尝试使用多个数据源配置 Spring Boot 1.5.9 项目,其中一些是 Neo4j。我使用的 spring-data-neo4j 版本是 4.2.9。
我的目标是为不同的存储库使用不同的 SessionFactory,为每个存储库使用不同的配置类。
我已经让这一切都与 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.
在记录器中打开调试并查看代码将我带到SessionBeanDefinitionRegistrarPostProcessor,其中包含以下用于获取 sessionFactory 的代码:
private static String getSessionFactoryBeanRef(ConfigurableListableBeanFactory beanFactory) {
return beanFactory.containsBeanDefinition("sessionFactory") ? "sessionFactory" : "getSessionFactory";
}
嗯... bean 的硬编码名称,没有可定制性的迹象。
然后我继续命名我的 bean 两次,@Bean("sessionFactory", NEO4J_SESSIONFACTORY_NAME)
所以上面的代码会通过。
应用程序启动了,但问题是存储库与调用的任何 bean 连接在一起sessionFactory
,实际上没有使用sessionFactoryRef
on 注释。
为了测试这一点,我将注释上的名称更改为不存在的 bean,然后它继续启动(如果我使用 mongo-annotation 执行此操作,应用程序将退出,因为 mongoTemplateRef 中提到的 bean 不可用)。
我挖得更深一点,发现对于 mongo,它检索了此类中的 bean 引用。等效的neo4j 实现没有这样的东西。sessionFactoryRef
它当然可以是一个实现细节,但除了注释和 xml-schema 之外,我找不到对该属性的任何引用。
配置类中还有其他地方期望只有一个 SessionFactory 可用。
所以,简而言之,在我看来,它EnableNeo4jRepositories.sessionFactoryRef
没有实现,因此 simple 没有做任何事情。因此,对于当前代码,必须存在单个 bean“sessionFactory”,并且所有存储库都将与此 bean 连接,而不管 sessionFactoryRef 的值如何。
有类似经验或知道如何为此提交错误的其他人吗?