Springboot: проблема при совместном импорте spring-data-jdbc и spring-data-cassandra в рамках одного проекта

В моем приложении springboot я хочу подключиться к двум источникам данных, базе данных cassandra и базе данных оракула.

Итак, я добавил в свой pom.xml следующее:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-cassandra</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jdbc</artifactId>
    </dependency>

Вот репозиторий для Oracle DB:

import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface TestRepository extends ReadRepository<TestEntity, String> {

    @Query("select * from test_table where id = :distributorId fetch first 10 rows only")
    List<TestEntity> getResult(@Param("distributorId") String distributorId);
}

ReadRepository расширяет репозиторий

import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.Repository;

@NoRepositoryBean
public interface ReadRepository<T, ID> extends Repository<T, ID> {}

Что ж, это работает нормально, когда я комментирую зависимость cassandra:

<!-- <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-cassandra</artifactId>
</dependency> -->

Но в тот момент, когда я добавляю зависимость от cassandra, я начинаю видеть эту ошибку:

***************************
APPLICATION FAILED TO START
***************************

Description:

The bean 'TestRepository', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

В целях отладки я удалил все классы, связанные с cassandra (репозиторий, сущность и т. д.), так что jar cassandra нигде в проекте не импортируется. И, следовательно, сузился до этого как первопричины.

Я понятия не имею, что вызывает эту проблему. Из журнала ошибок кажется, что bean-компонент пытается быть создан дважды или около того. Но почему это возможно?

Если я добавлю свойство, я столкнусь с другой проблемой, которая намекает на то, что cassandra import пытается что-то сделать с testRepository:

spring.main.allow-bean-definition-overriding=true

Error:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'testController': Unsatisfied dependency expressed through field 'TestRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'TestRepository': Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cassandraTemplate' defined in class path resource [org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfiguration.class]: Unsatisfied dependency expressed through method 'cassandraTemplate' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraSession' defined in class path resource [org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfiguration.class]: Invocation of init method failed; nested exception is com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: localhost/0:0:0:0:0:0:0:1:9042 (com.datastax.driver.core.exceptions.TransportException: [localhost/0:0:0:0:0:0:0:1:9042] Cannot connect), localhost/127.0.0.1:9042 (com.datastax.driver.core.exceptions.TransportException: [localhost/127.0.0.1:9042] Cannot connect))

Может кто-нибудь помочь в этом. Заранее спасибо.


person Somen Biswas    schedule 07.06.2020    source источник
comment
Решит ли проблему добавление аннотации @Table к TestEntity?   -  person Jens Schauder    schedule 08.06.2020
comment
@JensSchauder у меня это уже есть: import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Table; @Table("test_tnt") public class TestEntity{}   -  person Somen Biswas    schedule 08.06.2020
comment
вы используете текущую версию Spring Data JDBC? С этим была ошибка, но она уже давно исправлена.   -  person Jens Schauder    schedule 08.06.2020
comment
Я использовал springboot 2.2.0.RELEASE. При обновлении до 2.2.6.RELEASE была решена одна проблема, но теперь я вижу это: org.springframework.beans.factory.BeanCreationException: ошибка создания bean-компонента с именем «cassandraSession», определенным в ресурсе пути к классу [org/springframework/boot/ autoconfigure/data/cassandra/CassandraDataAutoConfiguration.class]: не удалось вызвать метод инициализации;   -  person Somen Biswas    schedule 08.06.2020
comment
вложенным исключением является com.datastax.driver.core.exceptions.NoHostAvailableException: все хосты, которые пытались выполнить запрос, не удалось (пробовали: localhost/127.0.0.1:9042 (com.datastax.driver.core.exceptions.TransportException: [localhost/ 127.0.0.1:9042] Невозможно подключиться), localhost/0:0:0:0:0:0:0:1:9042 (com.datastax.driver.core.exceptions.TransportException: [localhost/0:0:0 :0:0:0:0:1:9042] Не удается подключиться))   -  person Somen Biswas    schedule 08.06.2020
comment
Привет. Вы уверены, что ваша Кассандра запущена и работает? Можете ли вы подключиться к нему с помощью клиента cql?   -  person eladyanai    schedule 08.06.2020
comment
@eladyanai, как упоминалось в моем посте, я не подключаюсь ни к какому cassandra db/table/repo. Я начинаю получать сообщение об ошибке, когда добавляю spring-data-cassandra в качестве зависимости.   -  person Somen Biswas    schedule 08.06.2020
comment
Да, потому что java-драйвер cassandra работает путем подключения к кластеру cassandra при запуске для обнаружения узлов, пула соединений и т. д. Если у вас нет работающей cassandra, она выйдет из строя! Проверьте это docs.datastax.com/en/developer/java-driver/ 3.0 см. раздел устранения неполадок.   -  person eladyanai    schedule 08.06.2020
comment
Спасибо @eladyanai. Я могу добиться некоторого прогресса в этом, но я столкнулся с другим набором проблем, как указано в [stackoverflow.com/questions/62267799/ Я новичок в использовании cassandra и spring-data-cassandra, поэтому не уверен, где это отсутствует.   -  person Somen Biswas    schedule 08.06.2020
comment
Я сомневаюсь, что это поможет решить текущую проблему, но убедитесь, что все сущности JDBC имеют аннотацию @Table. Это пометит их для получения Spring Data JDBC. Это необходимо, когда у вас есть два или более модулей Spring Data.   -  person Jens Schauder    schedule 09.06.2020
comment
Привет. Я опубликую свой комментарий в качестве ответа для других людей с той же проблемой. мы продолжим работу над остальными в другой ветке. благодарю вас.   -  person eladyanai    schedule 09.06.2020
comment
Попробуйте этот @Configuration @EnableCassandraRepositories (basePackages = пакет com.base) открытый класс CassandraConfig extends AbstractCassandraConfiguration { // }   -  person Lakshman    schedule 09.06.2020


Ответы (2)


При использовании зависимости от cassandra вы получаете java-драйвер cassandra.

Драйвер пытается подключиться к Cassandra при запуске для получения информации, такой как узлы кластера (автоматическое обнаружение), пул соединений, подтверждение активности, диапазон хэш-ключей для каждого узла и многое другое.

Как указано в ошибке, вам не удается подключиться к базе данных Cassandra на локальном хосте:

nested exception is com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: localhost/0:0:0:0:0:0:0:1:9042
(com.datastax.driver.core.exceptions.TransportException:
[localhost/0:0:0:0:0:0:0:1:9042] Cannot connect), localhost/127.0.0.1:9042 
(com.datastax.driver.core.exceptions.TransportException: [localhost/127.0.0.1:9042] 
Cannot connect))

Попробуйте подключиться к вашему кластеру Cassandra с помощью клиента cql:

cqlsh localhost -u cassandra -p cassandra

если это не удается, Cassandra, вероятно, не в сети, и вам нужно запустить ее:

sudo dse cassandra -R

для получения дополнительной информации см. здесь: https://docs.datastax.com/en/developer/java-driver/3.0/#troubleshooting

person eladyanai    schedule 09.06.2020

Попробуй это

@Configuration
@EnableCassandraRepositories(
  basePackages = "base package where you have kept your cassandra jpa")
public class CassandraConfig extends AbstractCassandraConfiguration {

}
person Lakshman    schedule 09.06.2020