Cassandra存储库始终使用来自application.properties文件的键空间,而不是来自AbstractCassandraConfiguration扩展类的键空间 [英] Cassandra Repository is always using keyspace from application.properties file not from the extended class of AbstractCassandraConfiguration

查看:387
本文介绍了Cassandra存储库始终使用来自application.properties文件的键空间,而不是来自AbstractCassandraConfiguration扩展类的键空间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的数据位于不同的键空间中,在一个Spring Boot应用程序中我有多个键空间,因此我希望我的cassandra存储库可配置为每个具有不同的键空间,而不是在应用程序级别具有一个键空间.在春季项目中,我希望可以在存储库级别配置键空间.

Cassandra存储库始终使用application.properties文件中的键空间,如果我扩展 AbstractCassandraConfiguration 类并配置键空间和端口,则该键不起作用. 我创建了一个实体,CassandraConfig和存储库,并尝试使用存储库查询和更新实体.请参阅下面的代码.

Cassandra Repository is always using keyspace from application.properties file, Not working if i extend AbstractCassandraConfiguration class and configure keyspace and port. I have created a Entity, CassandraConfig and Repository and tried to query and update Entity using Respository. Refer my code below.

pom.xml

<dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-cassandra</artifactId>
        <version>2.0.7.RELEASE</version>
</dependency>

实体代码:-

import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.Table;

@Table
public class Company {
    @PrimaryKey
    private String companyid;
    private String companyName;
    private String address;
    public String getCompanyid() {
        return companyid;
    }
    public void setCompanyid(String companyid) {
        this.companyid = companyid;
    }
    public String getCompanyName() {
        return companyName;
    }
    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }

}

Cassandra配置代码:-

Cassandra config code :-

import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.config.AbstractCassandraConfiguration;
import org.springframework.data.cassandra.repository.config.EnableCassandraRepositories;

@Configuration
@EnableCassandraRepositories(basePackageClasses=CompanyRepository.class)
public class CassandraConfig extends AbstractCassandraConfiguration {

    public String getContactPoints() {
        return "127.0.0.1";
      }
    @Override
    protected String getKeyspaceName() {
        return "CompanyDetails";
    }

}

存储库代码:-

import java.util.List;

    import org.springframework.data.cassandra.repository.CassandraRepository;
    import org.springframework.data.cassandra.repository.Query;
    import org.springframework.stereotype.Repository;

@Repository

    public interface CompanyRepository extends CassandraRepository<Company, String> {
                    @Query(allowFiltering=true)
                    public Company findByCompanyName(String companyname);

                    public List<Company> findAll();
    }

我尝试使用扩展AbstractCassandraConfiguration而不是application.properties的类为存储库设置键空间.这没用 cassandraTemplate工作正常.我只有存储库出现问题. 即使我创建和配置CassandraClusterFactoryBean,CassandraMappingContext,CassandraConverter和CassandraSessionFactoryBean bean存储库都在异常以下抛出

I tried to set keyspace for Repository using the class which extend AbstractCassandraConfiguration instead of application.properties. it didn't work cassandraTemplate is working fine. i am getting issue with only Repository. even if i create and configure CassandraClusterFactoryBean, CassandraMappingContext, CassandraConverter and CassandraSessionFactoryBean beans repository is throwing below exception

com.datastax.driver.core.exceptions.InvalidQueryException: No keyspace has been specified. USE a keyspace, or explicitly specify keyspace.tablename
    at com.datastax.driver.core.Responses$Error.asException(Responses.java:147) ~[cassandra-driver-core-3.4.0.jar:na]
    at com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:179) ~[cassandra-driver-core-3.4.0.jar:na]

如果我将以下条目添加到application.properties文件中,则说明工作正常.

if i add below entries to application.properties file then it is working fine.

spring.data.cassandra.port=9042
spring.data.cassandra.keyspace-name=CompanyDetails
spring.data.cassandra.contact-points=127.0.0.1

是否可以通过扩展AbstractCassandraConfiguration类而不是application.properties的类来为存储库设置密钥空间?

如果我错过或做错了事,请随时指出.

Feel free to point, if i missed or did something wrong.

推荐答案

似乎您忘记了创建键盘.使用getKeySpaceName(),您可以告诉cassandra您要使用哪个键空间,但是如果不存在,则会出现错误.要创建键空间,请使用以下方法:

It looks like you forgot to create the keysace. With getKeySpaceName() you tell cassandra which keyspace you want to use but if it is not there you'll get an error. To create a keyspace use the following method:

@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
    return Arrays.asList(
            CreateKeyspaceSpecification.createKeyspace()
                    .name("your_keyspace_name")
                    .ifNotExists()
    );
}

这篇关于Cassandra存储库始终使用来自application.properties文件的键空间,而不是来自AbstractCassandraConfiguration扩展类的键空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆