首页 > 解决方案 > 引起:com.datastax.oss.driver.api.core.InvalidKeyspaceException: Invalid keyspace mykeyspace in Spring Boot Cassandra

问题描述

我设计了一个使用 Spring boot 和 Cassandra 的项目,它在 Docker Container 上运行。

在我实现了 Cassandra 的配置后,我运行了这个项目,它抛出了如下所示的错误。

Caused by: com.datastax.oss.driver.api.core.InvalidKeyspaceException: Invalid keyspace mykeyspace

我该如何解决这个问题?

这是我的 application.properties 文件。

spring.cassandra.contactpoints=127.0.0.1
spring.cassandra.port=9042
spring.data.cassandra.keyspace-name=mykeyspace
spring.cassandra.basepackages=com.springboot.cassandra

这是Cassandra的配置文件

@Configuration
@EnableCassandraRepositories
public class CassandraConfiguration extends AbstractCassandraConfiguration {

    @Value("${spring.cassandra.contactpoints}")
    private String contactPoint;

    @Value("${spring.cassandra.port}")
    private int port;

    @Value("${spring.data.cassandra.keyspace-name}")
    private String keyspaceName;

    @Value("${spring.cassandra.basepackages}")
    private String basePackages;

    @Override
    protected String getKeyspaceName() {
        return keyspaceName;
    }

    @Override
    protected int getPort() {
        return port;
    }

    @Override
    protected String getContactPoints() {
        return contactPoint;
    }

    @Override
    public SchemaAction getSchemaAction() {
        return SchemaAction.CREATE_IF_NOT_EXISTS;
    }

    @Override
    public String[] getEntityBasePackages() {
        return new String[] {basePackages};
    }

}

标签: spring-bootcassandra

解决方案


默认情况下,Spring Data不会为您创建或更改架构。这对于大多数用例来说都是一件好事,因为通常您不希望基于 java 类创建模式。一般来说,改变会更糟,特别是对 Cassandra 来说也很困难。

如果你想让 spring 创建它,你需要:

spring.data.cassandra.schema-action=CREATE_IF_NOT_EXISTS

我仍然建议不要在生产中使用它。

然而,在谈论键空间时,根据我的知识文档的措辞, 即使您使用上面的代码,spring 也不会创建键空间。这对 Cassandra 来说很有意义,因为键空间需要诸如复制策略和复制因子之类的信息,后者会因诸如添加或删除新数据中心之类的事情而改变。这些是不应该留给 Spring 的管理任务。


推荐阅读