Springboot:在同一项目中同时导入spring-data-jdbc和spring-data-cassandra时出现的问题

问题描述 投票:0回答:2

在我的springboot应用程序中,我想连接到两个数据源,一个cassandra DB和一个oracle DB。

因此,我将以下内容添加到了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> -->

但是当我添加卡桑德拉依赖性时,我开始看到此错误:

***************************
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相关的类(存储库,实体等),以便不将cassandra jar导入项目中的任何位置。因此,将其缩小为根本原因。

我不知道是什么导致了这个问题。从错误日志来看,似乎该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))

有人可以帮忙吗?预先感谢。

java spring spring-boot spring-data-cassandra spring-data-jdbc
2个回答
0
投票

使用cassandra依赖项时,会获得cassandra java驱动程序。

驱动程序试图在启动时连接到Cassandra,以获取诸如群集节点(自动发现),连接池,保持活动状态,每个节点的哈希键范围等信息。

由于错误状态,您无法连接到本地主机上的Cassandra DB:

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))

尝试使用cql客户端连接到您的Cassandra群集:

cqlsh localhost -u cassandra -p cassandra

如果失败,您的Cassandra可能已脱机,您需要启动它:

sudo dse cassandra -R

有关更多信息,请单击此处:https://docs.datastax.com/en/developer/java-driver/3.0/#troubleshooting


0
投票

尝试此

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

}
© www.soinside.com 2019 - 2024. All rights reserved.