2017-09-12 2 views
0

J'ai le problème suivant: je veux faire une liste de modèles Cassandra à partir d'une liste de sessions. Cependant, le problème est qu'à l'exécution je comprends que l'objet de la session est nul. Le code i utilise est le suivant:Cassandra session null à l'exécution

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; 
    } 

} 

Je reçois la réponse suivante du serveur:

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

Répondre

1

CassandraSessionFactoryBean nécessite une initialisation après avoir réglé toutes les propriétés. Appelez CassandraSessionFactoryBean.afterPropertiesSet() avant d'obtenir le Session. Vous devez également nettoyer les sessions lors de l'arrêt de l'application.

Idéalement, vous devez enregistrer BeanDefinition s pour chaque haricot Session et CassandraOperations que vous souhaitez créer.

Références:

0

Je n'ai pas travaillé avec le printemps avant alors pardonnez-moi si je me manque quelque chose. Mais je ne vois pas que vous définissez des points de contact, alors comment le pilote va savoir quel cluster à interroger?

Essayez ceci:

cluster.setContactPoints(<cassandra_server_ip>); 
+0

J'ai une classe de configuration qui le fait, c'est pourquoi je suis injectais le cluster et le convertisseur: – Carolik

+0

L'idée est que je veux générer les modèles et les sessions de façon dynamique et les parcourir et utiliser celui qui convient en fonction du besoin. Jusqu'à présent, je n'ai pu avoir plus de sessions en créant plusieurs modèles dans la classe Configuration, mais maintenant je veux générer la session et le modèle correspondant de manière dinamique en lisant les espaces de clés à partir d'un fichier de propriétés. – Carolik

+0

D'accord, je comprends mieux maintenant. Cependant, cela va au-delà de mes connaissances, j'espère que quelqu'un d'autre peut vous aider. –