运行时 Cassandra 会话为空

Cassandra session null at runtime

我有以下问题:我想从会话列表开始制作 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"
}

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

试试这个:

cluster.setContactPoints(<cassandra_server_ip>);

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

理想情况下,您将为每个要创建的 SessionCassandraOperations bean 注册 BeanDefinition

参考文献: