【问题标题】:Cassandra session null at runtimeCassandra 会话在运行时为空
【发布时间】:2017-09-12 23:39:54
【问题描述】:

我有以下问题:我想从会话列表开始制作 Cassandra 模板列表。但是问题是在运行时我得到会话对象为空。 我使用的代码如下:

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.cassandra.config.CassandraClusterFactoryBean;
import org.springframework.data.cassandra.config.CassandraSessionFactoryBean;
import org.springframework.data.cassandra.config.SchemaAction;
import org.springframework.data.cassandra.convert.CassandraConverter;
import org.springframework.data.cassandra.core.CassandraOperations;
import org.springframework.data.cassandra.core.CassandraTemplate;
import org.springframework.stereotype.Component;

@Component
public class KeyspaceSession {

    @Autowired
    @Qualifier("cluster")
    CassandraClusterFactoryBean cluster;

    @Autowired
    @Qualifier("converter")
    CassandraConverter converter;


    public List<CassandraOperations> getTemplates(){
        List<CassandraOperations> listOfTemplates = new ArrayList<>();
        for(CassandraKeyspaces keyspace : CassandraKeyspaces.values()){
            CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();
            session.setCluster(cluster.getObject());
            session.setKeyspaceName(keyspace.getKeyspace());
            session.setConverter(converter);
            session.setSchemaAction(SchemaAction.CREATE_IF_NOT_EXISTS); 
            CassandraOperations op = new CassandraTemplate(session.getObject());
            listOfTemplates.add(op);
        }
        return listOfTemplates;
    }

}

我从服务器得到以下答案:

{
  "timestamp": 1505204641753,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "java.lang.IllegalArgumentException",
  "message": "Session must not be null",
  "path": "/getUser/10/pl"
}

【问题讨论】:

    标签: cassandra spring-data-cassandra


    【解决方案1】:

    CassandraSessionFactoryBean 需要在您设置完所有属性后进行初始化。在获取Session 之前,请致电CassandraSessionFactoryBean.afterPropertiesSet()。您还需要在应用程序关闭时清理会话。

    理想情况下,您应该为要创建的每个 SessionCassandraOperations bean 注册 BeanDefinitions。

    参考资料:

    【讨论】:

      【解决方案2】:

      我之前没有使用过 Spring,如果我遗漏了什么,请原谅我。但是我没有看到您设置了任何联系点,那么驱动程序如何知道要查询哪个集群?

      试试这个:

      cluster.setContactPoints(<cassandra_server_ip>);
      

      【讨论】:

      • 我有一个配置类可以做到这一点,这就是我注入集群和转换器的原因:
      • 这个想法是我想动态地生成模板和会话并循环通过它们并根据需要使用适当的。到目前为止,我只能通过在配置类中创建多个模板来获得更多会话,但是现在我想通过从属性文件中读取键空间来动态生成会话和相应的模板。
      • 好的,我现在明白了。但是这超出了我的知识范围,希望其他人可以帮助您。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多