【问题标题】:Spring data reactive Cassandra not creating keyspace on startup - InvalidQueryException: Keyspace 'xxx' does not existSpring数据反应Cassandra没有在启动时创建键空间-InvalidQueryException:键空间'xxx'不存在
【发布时间】:2019-06-29 07:50:52
【问题描述】:

我正在使用 Spring Data Reactive Cassandra。下面给出的是我的配置类。我的期望是,当 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.beans.factory.BeanCreationException:创建名为“myRepository”的 bean 时出错:在设置 bean 属性“reactiveCassandraOperations”时无法解析对 bean“reactiveCassandraTemplate”的引用;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建 com.company.domain.CassandraConfig 中定义的名称为“reactiveCassandraTemplate”的 bean 时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.cassandra.core.ReactiveCassandraTemplate]:工厂方法“reactiveCassandraTemplate”抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建 com.company.domain.CassandraConfig 中定义的名称为“reactiveSessionFactory”的 bean 时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.cassandra.ReactiveSessionFactory]:工厂方法“reactiveSessionFactory”抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建 com.company.domain.CassandraConfig 中定义的名称为“reactiveSession”的 bean 时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.cassandra.ReactiveSession]:工厂方法“reactiveSession”抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建 com.company.domain.CassandraConfig 中定义的名称为“会话”的 bean 时出错:调用 init 方法失败;嵌套异常是 com.datastax.driver.core.exceptions.InvalidQueryException: Keyspace 'mykeyspace' 不存在

【问题讨论】:

    标签: spring-data reactive-programming reactive spring-data-cassandra


    【解决方案1】:

    终于用下面的代码解决了。我们需要在 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));
    }
    
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 2013-01-02
      • 2013-03-07
      • 2017-05-02
      • 2015-08-22
      • 2017-04-28
      • 2019-03-01
      • 2023-03-27
      • 2019-06-18
      相关资源
      最近更新 更多