Spring boot Neo4jConfiguration具有循环引用

Spring boot Neo4jConfiguration具有循环引用,spring-boot,spring-data-neo4j,Spring Boot,Spring Data Neo4j,我在spring引导应用程序中使用spring-data-neo4j。我通过继承Neo4jConfiguration类,按照中和许多其他地方的建议进行了配置。在所提供的示例中,当数据库位置硬编码时,这种方法有效。但是,当我想使用占位符从属性文件中检索数据库位置时,它不会被检索,并且我会得到null。这是密码 @Configuration @EnableNeo4jRepositories(basePackageClasses = {MyRepository.class}) public class

我在spring引导应用程序中使用spring-data-neo4j。我通过继承Neo4jConfiguration类,按照中和许多其他地方的建议进行了配置。在所提供的示例中,当数据库位置硬编码时,这种方法有效。但是,当我想使用占位符从属性文件中检索数据库位置时,它不会被检索,并且我会得到null。这是密码

@Configuration
@EnableNeo4jRepositories(basePackageClasses = {MyRepository.class})
public class Neo4jConfig extends Neo4jConfiguration {

    @Value("${neo4j.location}")
    private String neo4jDatabaseLocation;

    @Bean
    public GraphDatabaseService graphDatabaseService() {
        return new GraphDatabaseFactory()
               .newEmbeddedDatabase(neo4jDatabaseLocation);
    }
    ...
这通常适用于任何其他配置类,但不适用于此配置类,因为有几个方法标记为@Autowired。这会导致循环引用,并且未正确初始化。这可以在日志中看到:

2014-09-06 20:59:45.168 DEBUG 4665 --- [           main] o.s.b.f.annotation.InjectionMetadata     : Registered injected element on class [c.m.f.Neo4jConfig$$EnhancerBySpringCGLIB$$7165d752]: AutowiredFieldElement for private javax.validation.Validator org.springframework.data.neo4j.config.Neo4jConfiguration.validator
2014-09-06 20:59:45.169 DEBUG 4665 --- [           main] o.s.b.f.annotation.InjectionMetadata     : Registered injected element on class [c.m.f.Neo4jConfig$$EnhancerBySpringCGLIB$$7165d752]: AutowiredMethodElement for public void org.springframework.data.neo4j.config.Neo4jConfiguration.setConversionService(org.springframework.core.convert.ConversionService)
2014-09-06 20:59:45.169 DEBUG 4665 --- [           main] o.s.b.f.annotation.InjectionMetadata     : Registered injected element on class [c.m.f.Neo4jConfig$$EnhancerBySpringCGLIB$$7165d752]: AutowiredMethodElement for public void org.springframework.data.neo4j.config.Neo4jConfiguration.setGraphDatabaseService(org.neo4j.graphdb.GraphDatabaseService)
2014-09-06 20:59:45.169 DEBUG 4665 --- [           main] o.s.b.f.annotation.InjectionMetadata     : Registered injected element on class [c.m.f.Neo4jConfig$$EnhancerBySpringCGLIB$$7165d752]: AutowiredFieldElement for private java.lang.String c.m.f.Neo4jConfig.neo4jDatabaseLocation
2014-09-06 20:59:45.169 DEBUG 4665 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Eagerly caching bean 'c.m.f.Neo4jConfig' to allow for resolving potential circular references
2014-09-06 20:59:45.171 DEBUG 4665 --- [           main] o.s.b.f.annotation.InjectionMetadata     : Processing injected method of bean 'c.m.f.Neo4jConfig': AutowiredFieldElement for private javax.validation.Validator org.springframework.data.neo4j.config.Neo4jConfiguration.validator
2014-09-06 20:59:45.182 DEBUG 4665 --- [           main] o.s.b.f.annotation.InjectionMetadata     : Processing injected method of bean 'c.m.f.Neo4jConfig': AutowiredMethodElement for public void org.springframework.data.neo4j.config.Neo4jConfiguration.setConversionService(org.springframework.core.convert.ConversionService)
2014-09-06 20:59:45.183 DEBUG 4665 --- [           main] o.s.b.f.annotation.InjectionMetadata     : Processing injected method of bean 'c.m.f.Neo4jConfig': AutowiredMethodElement for public void org.springframework.data.neo4j.config.Neo4jConfiguration.setGraphDatabaseService(org.neo4j.graphdb.GraphDatabaseService)
2014-09-06 20:59:45.184 DEBUG 4665 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Creating shared instance of singleton bean 'graphDatabaseService'
2014-09-06 20:59:45.184 DEBUG 4665 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Creating instance of bean 'graphDatabaseService'
2014-09-06 20:59:45.185 DEBUG 4665 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
2014-09-06 20:59:45.185 DEBUG 4665 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
2014-09-06 20:59:45.188 DEBUG 4665 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Returning eagerly cached instance of singleton bean 'c.m.f.Neo4jConfig' that is not fully initialized yet - a consequence of a circular reference

正如您所看到的,我在这里试图实现的不是硬编码数据库位置。这个循环引用问题有什么解决方法吗?或者其他的配置方式?由于这是一个spring boot应用程序,我没有任何Xml配置,如果可能的话,我希望保持这种方式。

您是否尝试过将neo4jDatabaseLocation作为参数传入:

@Configuration
@EnableNeo4jRepositories(basePackageClasses = {MyRepository.class})
public class Neo4jConfig extends Neo4jConfiguration {

    @Bean
    public GraphDatabaseService graphDatabaseService(@Value("${neo4j.location}") String neo4jDatabaseLocation) {
        return new GraphDatabaseFactory()
               .newEmbeddedDatabase(neo4jDatabaseLocation);
    }
    ...
}

建议对我使用的spring框架版本不起作用。作为一种解决方法,我在另一个配置文件中定义了
GraphDatabaseService
bean,该配置文件不扩展Neo4jConfiguration。请注意,无论如何都需要这个
Neo4jConfig

而不是
@Value
注入
环境
,并使用
getProperty
getRequiredProperty
方法获取实际值。在配置类中,我总是倾向于使用
环境
而不是
@Value
。我也遇到了同样的问题,这个答案对我来说也适用。在Neo4j spring-data-Neo4j 3.3.2上遇到同样的问题,在阅读您的评论后,我创建了另一个只包含@Bean GraphDatabaseService GraphDatabaseService()的类{返回新的SpringCypherRestGraphDatabase(Neo4JProperty.getServerUrl(),Neo4JProperty.getUsername(),Neo4JProperty.getPassword());}定义。你解决了我的问题!@rosencreuz,Stephane你能分享你的应用程序/配置/额外类源吗?我也在尝试处理这个问题,但目前为止运气不好。。。