【问题标题】:Springboot: Issue when importing spring-data-jdbc and spring-data-cassandra together within same projectSpringboot:在同一项目中同时导入 spring-data-jdbc 和 spring-data-cassandra 时出现问题
【发布时间】:2020-09-26 19:44:00
【问题描述】:

在我的 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> -->

但是在我添加 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 相关的类(存储库、实体等),因此不会在项目的任何地方导入 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))

有人可以帮忙吗?提前致谢。

【问题讨论】:

  • TestEntity 中添加@Table 注释能解决问题吗?
  • @JensSchauder 我已经有了:import org.springframework.data.relational.core.mapping.Column;import org.springframework.data.relational.core.mapping.Table;@Table("test_tnt")public class TestEntity{}
  • 您使用的是当前版本的 Spring Data JDBC 吗?这有一个错误,但现在已经修复了很长一段时间。
  • 我使用的是 springboot 2.2.0.RELEASE。在升级到 2.2.6.RELEASE 时,它解决了一个问题,但现在我看到了:org.springframework.beans.factory.BeanCreationException: Error created bean with name 'cassandraSession' defined in class path resource [org/springframework/boot/ autoconfigure/data/cassandra/Cas​​sandraDataAutoConfiguration.class]: init 方法调用失败;
  • 嵌套异常是 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] 无法连接))

标签: java spring spring-boot spring-data-cassandra spring-data-jdbc


【解决方案1】:

使用 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

【讨论】:

    【解决方案2】:

    试试这个

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 2019-12-26
      • 2017-07-17
      • 2017-06-01
      • 2019-04-15
      相关资源
      最近更新 更多