2014-09-06 44 views
0

我在spring-boot应用程序中使用spring-data-neo4j。通过继承Neo4jConfiguration类,我按照spring.io guides和许多其他地方的建议进行了配置。这在数据库位置在所提供的示例中被硬编码时起作用。但是,当我想使用占位符从属性文件中检索数据库位置时,它不会被检索到,并且我会得到空值。下面的代码Neo4jConfiguration有循环引用

@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); 
    } 
    ... 

这通常可以在任何其他配置类,但不是在这一个,因为Neo4jConfiguration class有标有@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配置,如果可能的话我想保留它。

+0

代替'@ Value'注入'Environment'并使用'getProperty'或'getRequiredProperty'方法来获取实际值。在配置类中,我总是倾向于使用'Environment'而不是'@Value'。 – 2014-09-08 10:34:41

回答

1

拟议的建议并没有为我使用Spring Framework版本。作为一种解决方法,我在另一个不扩展Neo4jConfiguration的配置文件中定义了GraphDatabaseService bean。请注意,无论如何,这个Neo4jConfig类都是需要的。

+0

面对上Neo4j的弹簧数据Neo4j的3.3.2和阅读您的评论后,同样的问题,我只创建包含@Bean GraphDatabaseService graphDatabaseService()其他类{ 返回新SpringCypherRestGraphDatabase(neo4jProperties.getServerUrl(), neo4jProperties。 getUsername(),neo4jProperties.getPassword()); }定义。你解决了我的问题! – Stephane 2015-09-13 14:41:17

+0

@rosencreuz,斯蒂芬你能分享你的应用程序/配置/额外的类源?我正试图解决这个问题,但目前还没有运气...... – 2016-04-25 12:51:48

1

您是否尝试过在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); 
    } 
    ... 
} 
+0

我有同样的问题,这个答案为我工作。 – 2015-01-22 17:50:19