Spring Data Neo4j 4.x и sdn-university: Neo4jTemplate без автоподключения

Я обновляю наше приложение, которое очень похоже на sdn-university, с Spring Data Neo4j 3.x на Spring Data Neo4j 4.0.0.BUILD-SNAPSHOT. При добавлении экземпляра Neo4jTemplate с автоматическим подключением при запуске возникает следующее исключение:

... Вызвано: org.springframework.beans.factory.BeanCreationException: не удалось автоматически связать поле: private org.springframework.data.neo4j.template.Neo4jTemplate school.service.UserServiceImpl.template; вложенным исключением является org.springframework.beans.factory.NoSuchBeanDefinitionException: для зависимости не найден подходящий bean-компонент типа [org.springframework.data.neo4j.template.Neo4jTemplate]: ожидается по крайней мере 1 bean-компонент, который квалифицируется как кандидат autowire для этой зависимости. Аннотации зависимостей: {@org.springframework.beans.factory.annotation.Autowired(required=true)} в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:571) в org.springframework. beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ... еще 21 ...

Чтобы проверить результаты, я взял последнюю версию sdn-university, которая теперь также использует SDN4.x 4.0.0.BUILD-SNAPSHOT, из https://github.com/neo4j-examples/sdn4-university и модифицировали StudentServiceImpl, чтобы включить экземпляр Neo4jTemplate с автоматическим подключением. После выдачи mvn clean spring-boot:run -U воспроизводится ошибка, наблюдаемая в нашем приложении.

Что нужно изменить на sdn-university, чтобы успешно использовать Neo4jTemplate?


person Eric Spiegelberg    schedule 05.08.2015    source источник


Ответы (1)


Причина, по которой это не работает в SDN4, заключается в том, что Neo4jTemplate и его интерфейс Neo4jOperations имеют аннотацию @Repository. Поэтому Spring создает прокси класса Neo4jTemplate, который не выполняет автоматическое подключение из-за несоответствия типов.

Наилучший подход — писать код для интерфейса Neo4jOperations вместо класса Neo4jTemplate. Будет ли это иметь место в окончательном выпуске SDN4, пока не решено, хотя лично я всегда предпочитал кодирование интерфейсам.

Вам также может понадобиться объявить Neo4jOperations в качестве возвращаемого типа вашего метода bean factory:

@Bean
public Neo4jOperations neo4jTemplate() throws Exception {
    return new Neo4jTemplate(getSession());
}
person ATG    schedule 05.08.2015
comment
Я заменил наш единственный экземпляр Neo4jTemplate на Neo4jOperations как в нашем приложении, так и в sdn-university, и каждое приложение по-прежнему не запускается с той же ошибкой и трассировкой стека. Если я вас правильно понял, объявление «@Autowired private NeoOperations neoOperations» может/должно/должно работать, верно? - person Eric Spiegelberg; 05.08.2015
comment
Да, изменение типа поля autowired на Neo4jOperations должно помочь. Как выглядит ваш метод @Bean в вашем классе конфигурации? - person ATG; 06.08.2015
comment
Мне не хватало приведенного выше определения @Bean, которое вы предоставили выше. Однажды я добавил, что теперь все работает как положено. Спасибо. - person Eric Spiegelberg; 06.08.2015