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

Spring data Responsive Cassandra在启动时未创建键空间-InvalidQueryException:键空间“xxx”不存在

乐正德华
2023-03-14

我使用的是spring数据。下面是我的配置类。我的期望是,当spring boot应用程序加载时,它必须连接到Cassandra并创建密钥空间。但我的应用程序能够连接到Cassandra,但它没有创建密钥空间。我在启动时收到以下异常。如果我遗漏了什么,请告诉我。

import com.datastax.driver.core.PlainTextAuthProvider;
import com.datastax.driver.core.policies.ConstantReconnectionPolicy;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.config.AbstractReactiveCassandraConfiguration;
import org.springframework.data.cassandra.config.CassandraClusterFactoryBean;
import org.springframework.data.cassandra.config.SchemaAction;
import org.springframework.data.cassandra.core.cql.keyspace.CreateKeyspaceSpecification;
import org.springframework.data.cassandra.core.cql.keyspace.DropKeyspaceSpecification;
import org.springframework.data.cassandra.core.cql.keyspace.KeyspaceOption;
import org.springframework.data.cassandra.repository.config.EnableReactiveCassandraRepositories;

import java.util.Arrays;
import java.util.List;



@Configuration
@EnableReactiveCassandraRepositories
public class CassandraConfig extends AbstractReactiveCassandraConfiguration {
    @Value("${spring.data.cassandra.contactpoints}") private String contactPoints;
    @Value("${spring.data.cassandra.port}") private int port;
    @Value("${spring.data.cassandra.keyspace-name}") private String keyspace;

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


    @Override protected String getKeyspaceName() {
        return keyspace;
    }
    @Override protected String getContactPoints() {
        return contactPoints;
    }
    @Override protected int getPort() {
        return port;
    }
    @Override public SchemaAction getSchemaAction() {
        return SchemaAction.CREATE_IF_NOT_EXISTS;
    }
    @Override public String[] getEntityBasePackages() {
        return new String[] {
                basePackages
        };
    }

    @Override
    public CassandraClusterFactoryBean cluster() {
        PlainTextAuthProvider authProvider = new PlainTextAuthProvider(userName, password);

        CassandraClusterFactoryBean cluster=new CassandraClusterFactoryBean();

        cluster.setJmxReportingEnabled(false);
        cluster.setContactPoints(contactPoints);
        cluster.setPort(port);
        cluster.setAuthProvider(authProvider);
        cluster.setReconnectionPolicy(new ConstantReconnectionPolicy(1000));

        return cluster;
    }



    @Override
    protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {

        CreateKeyspaceSpecification specification = CreateKeyspaceSpecification.createKeyspace(keyspace)
                .ifNotExists()
                .with(KeyspaceOption.DURABLE_WRITES, true);

        return Arrays.asList(specification);
    }


    @Override
    protected List<DropKeyspaceSpecification> getKeyspaceDrops() {
        return Arrays.asList(DropKeyspaceSpecification.dropKeyspace(keyspace));
    }

}

通过构造函数参数5表示的未满足依赖关系;嵌套的异常是org。springframework。豆。工厂BeanCreationException:创建名为“myRepository”的bean时出错:设置bean属性“reactiveCassandraOperations”时无法解析对bean“reactiveCassandraTemplate”的引用;嵌套的异常是org。springframework。豆。工厂BeanCreationException:创建com中定义了名为“ReactiveCassandRateTemplate”的bean时出错。公司领域CassandraConfig:通过工厂方法实例化Bean失败;嵌套的异常是org。springframework。豆。Bean实例化异常:未能实例化[org.springframework.data.cassandra.core.reactiveCassandRateTemplate]:工厂方法“reactiveCassandRateTemplate”引发异常;嵌套的异常是org。springframework。豆。工厂BeanCreationException:创建com中定义的名为“reactiveSessionFactory”的bean时出错。公司领域CassandraConfig:通过工厂方法实例化Bean失败;嵌套的异常是org。springframework。豆。BeanInstationException:未能html" target="_blank">实例化[org.springframework.data.cassandra.ReactiveSessionFactory]:工厂方法“ReactiveSessionFactory”引发异常;嵌套的异常是org。springframework。豆。工厂BeanCreationException:创建com中定义的名为“reactiveSession”的bean时出错。公司领域CassandraConfig:通过工厂方法实例化Bean失败;嵌套的异常是org。springframework。豆。BeanInstationException:未能实例化[org.springframework.data.cassandra.ReactiveSession]:工厂方法“ReactiveSession”引发异常;嵌套的异常是org。springframework。豆。工厂BeanCreationException:创建com中定义的名为“session”的bean时出错。公司领域CassandraConfig:调用init方法失败;嵌套的异常是com。税收。驾驶员果心例外。InvalidQueryException:键空间“mykeyspace”不存在

共有1个答案

沈华晖
2023-03-14

终于用下面的代码把它修好了。我们需要在CassandraClusterFactoryBean上设置KeyspaceCreations,并启用@ComponentScan。

import com.datastax.driver.core.PlainTextAuthProvider;
import com.datastax.driver.core.policies.ConstantReconnectionPolicy;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.config.*;
import org.springframework.data.cassandra.core.cql.keyspace.CreateKeyspaceSpecification;
import org.springframework.data.cassandra.core.cql.keyspace.DropKeyspaceSpecification;
import org.springframework.data.cassandra.core.cql.keyspace.KeyspaceOption;
import org.springframework.data.cassandra.repository.config.EnableReactiveCassandraRepositories;

import java.util.Arrays;
import java.util.List;



@Configuration
@EnableReactiveCassandraRepositories(basePackages = "com.company.domain.data")
public class CassandraConfig extends AbstractReactiveCassandraConfiguration{
@Value("${spring.data.cassandra.contactpoints}") private String contactPoints;
@Value("${spring.data.cassandra.port}") private int port;
@Value("${spring.data.cassandra.keyspace-name}") private String keyspace;

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


@Override protected String getKeyspaceName() {
    return keyspace;
}
@Override protected String getContactPoints() {
    return contactPoints;
}
@Override protected int getPort() {
    return port;
}
@Override public SchemaAction getSchemaAction() {
    return SchemaAction.CREATE_IF_NOT_EXISTS;
}
@Override
public String[] getEntityBasePackages() {
    return new String[]{"com.company.domain.data"};
}

@Override
public CassandraClusterFactoryBean cluster() {
    PlainTextAuthProvider authProvider = new PlainTextAuthProvider(userName, password);

    CassandraClusterFactoryBean cluster=new CassandraClusterFactoryBean();

    cluster.setJmxReportingEnabled(false);
    cluster.setContactPoints(contactPoints);
    cluster.setPort(port);
    cluster.setAuthProvider(authProvider);
    cluster.setKeyspaceCreations(getKeyspaceCreations());
    cluster.setReconnectionPolicy(new ConstantReconnectionPolicy(1000));

    return cluster;
}


@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {

    CreateKeyspaceSpecification specification = CreateKeyspaceSpecification.createKeyspace(keyspace)
            .ifNotExists()
            .with(KeyspaceOption.DURABLE_WRITES, true);

    return Arrays.asList(specification);
}



@Override
protected List<DropKeyspaceSpecification> getKeyspaceDrops() {
    return Arrays.asList(DropKeyspaceSpecification.dropKeyspace(keyspace));
}



}
 类似资料:
  • 主要内容:什么是键空间(Keyspace)?,Cassandra Keyspace的不同组件Cassandra查询语言(CQL)可帮助开发人员与Cassandra沟通交互。 Cassandra查询语言的语法与SQL非常相似。 什么是键空间(Keyspace)? 键空间()是用于保存列族,用户定义类型的对象。 键空间(Keyspace)就像RDBMS中的数据库,其中包含列族,索引,用户定义类型,数据中心意识,键空间(Keyspace)中使用的策略,复制因子等。 在Cassandra中,“”

  • 我有一个带有springcassandra的SpringBoot2项目,我正在使用@RefreshScope在运行时创建密钥空间,并且我正在执行查询以使用该密钥空间,但模式不是从带有@Table注释的实体创建的。 当我启动应用程序时,如果不存在,就会创建一个新的键空间,并创建模式。之后,我更改app.properties中的keyspace,并向actuator/refresh发送POST请求。新

  • 问题内容: 我有两个Redis客户端,在一个文件中,我有一个简单的脚本设置并删除了Redis密钥: 在第二个文件中,我有一个Redis客户端充当订户: 关键的“占位符”已设置,那么是否有充分的理由使我在“消息”处理程序中未获得任何输出? 问题答案: 您忘记了订阅用户客户端订阅特定的频道。此外,如果要监视所有事件,则需要使用基于模式的订阅。 您可能想要执行以下操作(未测试): 请参阅Redis文档和

  • 在Cassandra中,“”命令用于从Cassandra中删除所有数据,列族,用户定义的类型和索引的键空间。 Cassandra在删除键空间之前,先获取键空间的快照。 如果Cassandra中不存在keyspace,Cassandra将返回错误,除非使用关键字。 语法 示例: 我们举一个例子来删除名为“”的键空间(keyspace)。 验证: 在执行上述命令后,从Cassandra中删除键空间“”

  • 主要内容:改变Cassandra中的Keyspace的要点“”命令用于更改Cassandra中创建的键空间中的复制因子,策略名称和持久写入属性。 语法: 或者 - 又或者 - 改变Cassandra中的Keyspace的要点 Keyspace Name: Cassandra中的键名称不能更改。 Strategy Name: 可以通过使用新的策略名称来更改战略名称。 Replication Factor : 可以通过使用新的复制因子来更改复制因子。 DUR

  • 点击“产品”标签中的“函数计算”,进入函数计算工作空间列表页,在创建空间前请先以管理员账号登录生态云,确保有创建空间的权限,点击“创建新空间”,输入名称及描述。