当前位置: 首页 > 知识库问答 >
问题:

Springboot:在同一项目中同时导入spring数据jdbc和spring数据cassandra时出现问题

蒋向笛
2023-03-14

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

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

这是orOracle 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);
}

ReadRepostory扩展存储库

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相关的类(存储库、实体等),这样就不会在项目中的任何地方导入cassandrajar。因此,将其作为根本原因。

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

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

共有2个答案

屠锐
2023-03-14

试试这个

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

}
余善
2023-03-14

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

驱动程序试图在启动时连接到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))

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

cqlshlocalhost-u cassandra-p cassandra

如果失败,卡桑德拉可能会离线,您需要启动它:

须藤DSE卡桑德拉-R

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

 类似资料:
  • 是否可以使用Spring数据JPA(以Hibernate作为JPA提供程序为后盾),同时直接使用Hibernate? 问题是,当我使用JpaTransactionManager时,我无法使用检索当前会话。当我切换到HibernateTransaction管理器时,JPA存储库无法提交更改。 下面是Spring上下文的部分(对于该上下文,我无法使用直接的Hibernate调用): hibernate

  • 问题内容: 是否可以使用Spring Data JPA(由Hibernate作为JPA提供者支持)并同时直接使用Hibernate? 问题是,当我使用JpaTransactionManager时,无法使用检索当前会话。当我切换到HibernateTransaction Manager时,JPA存储库无法提交更改。 这是我的Spring上下文的一部分(在该上下文中,我无法使用直接的Hibernate

  • 当我尝试将同一个POJO用于Spring Data JPA与Spring Data GemFire的集成时,存储库总是使用POJO访问数据库。但我希望存储库能够访问来自GemFire的数据,尽管我添加了注释和。 我想这是因为我在同一个POJO类中添加了和。 请帮助修复,让我知道,如果我可以这样做吗?我需要把它分成2个POJO类为数据库和GENFire工作吗? 谢谢

  • 如果我没有使用spring构建图形,那么是否可以使用spring框架完全访问我的neo4j图形?我正在尝试一些示例,但它似乎无法正常工作,因为spring创建的某些元数据不存在。 编辑:例如,我有这个错误当我试图通过它的id访问一个节点时,即

  • 在我的Spring Boot 1.5.1应用程序中,我将为Cassandra相关逻辑编写单元/集成测试。 我添加了以下Maven依赖项: 默认的Spring Boot Cassandra配置将连接到真正的Cassandra DB服务器。 在Spring/Spring Boot中是否有任何选项可以将我的测试配置为使用嵌入式Cassandra服务器?如果是这样,请显示所需的配置。

  • 我通过选择web、安全、验证和spring-boot Cassandra的几个依赖项下载了spring初始化器项目。当我尝试运行./gradlew bootrun时,我在启动过程中遇到以下异常