【问题标题】:Injecting custom datastax.session into Spring-Data Cassandra将自定义 datastax.session 注入 Spring-Data Cassandra
【发布时间】:2019-06-05 21:56:33
【问题描述】:
是否可以为 Spring-Data 使用自定义 datastax 会话?
您好,我知道 Cassandra 的 Spring-Data 在内部使用 datastax 会话。但是,我有一个自定义 datastax 会话对象(由另一个服务提供),我希望 Spring-Data 使用它而不是预先连接的那个。假设两个 datastax 会话的版本相同,这可能吗?
【问题讨论】:
标签:
cassandra
spring-data
datastax
datastax-java-driver
spring-data-cassandra
【解决方案1】:
是的,这是可能的。
根据您的设置,有几种方法。让我解释一下最常见的两种情况:
模板 API 的直接使用
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());
}
}