0

我正在尝试使用多个数据源配置 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,实际上没有使用sessionFactoryRefon 注释。

为了测试这一点,我将注释上的名称更改为不存在的 bean,然后它继续启动(如果我使用 mongo-annotation 执行此操作,应用程序将退出,因为 mongoTemplateRef 中提到的 bean 不可用)。

我挖得更深一点,发现对于 mongo,它检索了此类中的 bean 引用。等效的neo4j 实现没有这样的东西。sessionFactoryRef它当然可以是一个实现细节,但除了注释和 xml-schema 之外,我找不到对该属性的任何引用。

配置类中还有其他地方期望只有一个 SessionFactory 可用。

所以,简而言之,在我看来,它EnableNeo4jRepositories.sessionFactoryRef没有实现,因此 simple 没有做任何事情。因此,对于当前代码,必须存在单个 bean“sessionFactory”,并且所有存储库都将与此 bean 连接,而不管 sessionFactoryRef 的值如何。

有类似经验或知道如何为此提交错误的其他人吗?

4

0 回答 0