Spring Reactive Cassandra,使用自定义CqlSession

问题描述

我们如何在Spring Webflux应用程序上结合Spring Starter反应式Cassandra使用自定义CqlSession?

我目前正在执行以下操作,效果很好:

public class BaseCassandraConfiguration extends AbstractReactiveCassandraConfiguration {



    @Bean
    @NonNull
    @Override
    public CqlSessionfactorybean cassandraSession() {
        final CqlSessionfactorybean cqlSessionfactorybean = new CqlSessionfactorybean();
        cqlSessionfactorybean.setContactPoints(contactPoints);
        cqlSessionfactorybean.setKeyspaceName(keyspace);
        cqlSessionfactorybean.setLocalDatacenter(datacenter);
        cqlSessionfactorybean.setPort(port);
        cqlSessionfactorybean.setUsername(username);
        cqlSessionfactorybean.setPassword(passphrase);
        return cqlSessionfactorybean;
    }

但是,我想使用自定义会话,例如:

        CqlSession session = CqlSession.builder().build();

我们如何告诉此配置使用它?

谢谢

解决方法

选项1:

如果您希望完全覆盖自动配置的CqlSession bean,可以通过提供自己的CqlSesson bean即

来实现。
@Bean
public CqlSession cassandraSession() {
    return CqlSession.builder().withClientId(MyClientId).build();
}

覆盖整个bean的缺点是您将失去通过应用程序属性配置此会话的能力,并且将失去spring boot随附的默认设置。

选项2:

如果您想保留Spring Boot提供的默认值,并且能够通过应用程序属性配置会话,则可以使用CqlSessionBuilderCustomizerCqlSession提供特定的自定义配置。这可以通过定义该类型的bean来实现,即:

@Bean
public CqlSessionBuilderCustomizer myCustomiser() {
    return cqlSessionBuilder -> cqlSessionBuilder.withClientId(MyClientId);;
}

我个人的偏爱是选项2,因为它保留了spring boot所提供的功能,在我看来,随着时间的推移,该应用程序更易于维护。