2014-09-06 2 views
0

Я использую spring-data-neo4j в приложении с пружинной загрузкой. Я сделал конфигурацию, как рекомендовано в spring.io guides, и во многих других местах, наследуя класс Neo4jConfiguration. Это работает, когда местоположение базы данных жестко закодировано в приведенных примерах. Однако, когда я хочу использовать местозаполнитель для извлечения базы данных из файла свойств, он не извлекается, и я получаю null. Вот код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 

Как вы можете видеть, что я пытаюсь достичь здесь не Кодирую расположение базы данных. Существует ли какое-либо обходное решение для этой круглой справочной проблемы? Или, может быть, любой другой способ его настройки? Поскольку это приложение с пружинной загрузкой, у меня нет никакой конфигурации Xml, и если возможно, я хочу сохранить ее таким образом.

+0

Вместо '@ Value' введите' Environment' и используйте метод getProperty или getRequiredProperty для получения фактического значения. В классах конфигурации я всегда предпочитаю использовать 'Среда' вместо' @ Value'. –

ответ

1

Предлагаемые предложения не работают на Spring Framework версии я использую. В качестве обходного пути я определил bean-компонент GraphDatabaseService в другом файле конфигурации, который не расширяет Neo4jConfiguration. Обратите внимание, что этот класс Neo4jConfig необходим независимо.

+0

Столкнувшись с таким же вопросом о Neo4j пружинных данных-Neo4j 3.3.2 и после прочтения вашего комментария, я создал еще один класс, содержащий только @Bean GraphDatabaseService graphDatabaseService() { вернуть новый SpringCypherRestGraphDatabase (neo4jProperties.getServerUrl(), neo4jProperties. getUsername(), neo4jProperties.getPassword()); }. Вы решили мою проблему! – Stephane

+0

@rosencreuz, Stephane вы можете поделиться своим приложением/конфигурацией/источником дополнительного класса? Я пытаюсь справиться с этим, но пока не повезло ... –

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

У меня была такая же проблема, и этот ответ сработал для меня. –

Смежные вопросы