是否可以对Spring-Data使用自定义datastax会话?
嗨,我知道 Spring-Data for Cassandra 在内部使用 datastax 会话。但是,我有一个自定义的datastax会话对象(由另一个服务提供),我希望Spring-Data使用它而不是预先连接的那个。假设两个datastax会话的版本相同,这可能吗?
是的,这是可能的。
根据您的设置,有几种方法。让我解释两种最常见的情况:
直接使用模板接口
Session yourSession = …;
CqlTemplate cqlTemplate = new CqlTemplate(yourSession);
CassandraTemplate cassandraTemplate = new CassandraTemplate(yourSession);
将会话公开为@Bean
这可能需要更多设置,因为配置支持需要使用 CassandraSessionFactoryBean
和 CassandraClusterFactoryBean
。
看看AbstractCassandraConfiguration
,看看配置了哪些支持bean(CassandraConverter
,CassandraMappingContext
)来配置Spring Data的Cassandra支持。
@Configuration
class MyCassandraConfig {
private final Session mySession;
public MyCassandraConfig(Session mySession) {
this.mySession = mySession;
}
@Bean
public CassandraConverter cassandraConverter() {
MappingCassandraConverter mappingCassandraConverter = new MappingCassandraConverter(cassandraMapping());
mappingCassandraConverter.setCustomConversions(customConversions());
return mappingCassandraConverter;
}
@Bean
public CassandraMappingContext cassandraMapping() {
Cluster cluster = mySession.getCluster();
String keyspace = mySession.getLoggedKeyspace();
CassandraMappingContext mappingContext = new CassandraMappingContext(
new SimpleUserTypeResolver(cluster, keyspace), new SimpleTupleTypeFactory(cluster));
CustomConversions customConversions = customConversions();
mappingContext.setCustomConversions(customConversions);
mappingContext.setSimpleTypeHolder(customConversions.getSimpleTypeHolder());
return mappingContext;
}
@Bean
public CustomConversions customConversions() {
return new CassandraCustomConversions(Collections.emptyList());
}
@Bean
public CassandraTemplate cassandraTemplate() {
return new CassandraTemplate(mySession, cassandraConverter());
}
}