Как разрешить конфликты Spring Bean между Spring-data-neo4j и Grails 3.3.6 - PullRequest
0 голосов
/ 26 июня 2018

У меня есть приложение Grails 3.3.6. Я хотел объединить некоторые функции neo4j в этом приложении из другого приложения с весенней загрузкой. Поэтому я добавил следующие депы из весеннего загрузочного приложения -

compile "org.neo4j:neo4j:3.1.0"
compile "org.neo4j.driver:neo4j-java-driver:1.1.0"
compile "org.neo4j:neo4j-ogm-core:2.1.6"
compile "org.neo4j:neo4j-ogm-http-driver:2.1.6"
runtime "org.neo4j:neo4j-ogm-embedded-driver:2.1.6"
runtime "org.neo4j:neo4j-ogm-bolt-driver:2.1.6"
compile "org.springframework.boot:spring-boot-starter-data-neo4j"
compile 'org.springframework.data:spring-data-neo4j:4.2.0.RELEASE'

И поместите исходные файлы в папку src моего приложения Grails. Приложение весенней загрузки использует класс Configuration для создания bean-компонентов, которые выглядят так -

Configuration
@EnableNeo4jRepositories("com.server.repositories")
public class TestConfiguration {

@Value("${spring.data.neo4j.uri}")
String neo4jURL;

@Value("${spring.data.neo4j.username}")
String neo4jUser;

@Value("${spring.data.neo4j.password}")
String neo4jPass;

@Bean
public org.neo4j.ogm.config.Configuration configuration() {
    return new org.neo4j.ogm.config.Configuration.Builder().credentials(neo4jUser, neo4jPass).uri(neo4jURL).build();
}

@Bean
public SessionFactory neo4jSessionFactory() {
    // with domain entity base package(s)
    return new SessionFactory(configuration(), "com.server.model");
}

@Bean
public Neo4jTransactionManager neo4jTransactionManager() {
    return new Neo4jTransactionManager(neo4jSessionFactory());
}


@Bean
public Session neo4jSession() {
    return neo4jTransactionManager().getSessionFactory().openSession();
}

Когда я запускаю приложение grails, я получаю исключения из конфликта bean-компонентов. Похоже, Grails и neo4j пытаются создать несколько бинов с одинаковыми именами -

Unsatisfied dependency expressed through field 'neo4jSession'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.data.neo4j.transaction.SharedSessionCreator#0': Unsatisfied dependency expressed through method 'createSharedSession' parameter 0: Could not convert argument value of type [org.hibernate.internal.SessionFactoryImpl] to required type [org.neo4j.ogm.session.SessionFactory]: Failed to convert value of type 'org.hibernate.internal.SessionFactoryImpl' to required type 'org.neo4j.ogm.session.SessionFactory'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'org.hibernate.internal.SessionFactoryImpl' to required type 'org.neo4j.ogm.session.SessionFactory': no matching editors or conversion strategy found

Как мне решить эти конфликты бинов?

1 Ответ

0 голосов
/ 04 июля 2018

Вы должны указать имя компонента вашей фабрики сеансов Neo4j. В вашем случае это должно работать так, как вы ожидали:

@EnableNeo4jRepositories(sessionFactoryRef = "neo4jSessionFactory", basePackages = "com.server.repositories")

Справочная информация: Spring Data Neo4j будет искать бин с именем sessionFactory. Как вы можете видеть в своем исключении, Hibernate также создает bean-компонент с таким именем, и они вступают в конфликт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...