From c8105413b9333ade0dbe788b710f84e2827c7d71 Mon Sep 17 00:00:00 2001 From: Dmytro Nosan Date: Fri, 24 Jan 2020 11:13:33 +0200 Subject: [PATCH 1/2] Fix scope of CqlSessionBuilder bean See gh-19899 --- .../cassandra/CassandraAutoConfiguration.java | 2 ++ .../cassandra/CassandraAutoConfigurationTests.java | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java index 6bd25aa01fd..2a272e1a1b7 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java @@ -44,6 +44,7 @@ import org.springframework.boot.context.properties.PropertyMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; +import org.springframework.context.annotation.Scope; /** * {@link EnableAutoConfiguration Auto-configuration} for Cassandra. @@ -69,6 +70,7 @@ public class CassandraAutoConfiguration { @Bean @ConditionalOnMissingBean + @Scope("prototype") public CqlSessionBuilder cassandraSessionBuilder(CassandraProperties properties, DriverConfigLoader driverConfigLoader, ObjectProvider builderCustomizers) { CqlSessionBuilder builder = CqlSession.builder().withConfigLoader(driverConfigLoader); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java index e2f1be8027e..9cfad7df976 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java @@ -16,6 +16,8 @@ package org.springframework.boot.autoconfigure.cassandra; +import com.datastax.oss.driver.api.core.CqlIdentifier; +import com.datastax.oss.driver.api.core.CqlSessionBuilder; import com.datastax.oss.driver.api.core.config.DefaultDriverOption; import com.datastax.oss.driver.api.core.config.DriverConfigLoader; import com.datastax.oss.driver.api.core.config.DriverExecutionProfile; @@ -42,6 +44,17 @@ class CassandraAutoConfigurationTests { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(CassandraAutoConfiguration.class)); + @Test + void cqlSessionBuilderThreadSafe() { + this.contextRunner.run((context) -> { + CqlIdentifier keyspace = CqlIdentifier.fromCql("test"); + assertThat(context).hasSingleBean(CqlSessionBuilder.class); + assertThat(context.getBean(CqlSessionBuilder.class).withKeyspace(keyspace)) + .hasFieldOrPropertyWithValue("keyspace", keyspace); + assertThat(context.getBean(CqlSessionBuilder.class)).hasFieldOrPropertyWithValue("keyspace", null); + }); + } + @Test void driverConfigLoaderWithDefaultConfiguration() { this.contextRunner.run((context) -> { From 0516520b7ebacad3258ae1486c63c34c6593200d Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 28 Jan 2020 14:12:31 +0100 Subject: [PATCH 2/2] Polish "Fix scope of CqlSessionBuilder bean" See gh-19899 --- .../cassandra/CassandraAutoConfigurationTests.java | 10 +++++----- .../src/docs/asciidoc/spring-boot-features.adoc | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java index 9cfad7df976..897cc9a89c3 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java @@ -45,13 +45,13 @@ class CassandraAutoConfigurationTests { .withConfiguration(AutoConfigurations.of(CassandraAutoConfiguration.class)); @Test - void cqlSessionBuilderThreadSafe() { + void cqlSessionBuildHasScopePrototype() { this.contextRunner.run((context) -> { CqlIdentifier keyspace = CqlIdentifier.fromCql("test"); - assertThat(context).hasSingleBean(CqlSessionBuilder.class); - assertThat(context.getBean(CqlSessionBuilder.class).withKeyspace(keyspace)) - .hasFieldOrPropertyWithValue("keyspace", keyspace); - assertThat(context.getBean(CqlSessionBuilder.class)).hasFieldOrPropertyWithValue("keyspace", null); + CqlSessionBuilder firstBuilder = context.getBean(CqlSessionBuilder.class); + assertThat(firstBuilder.withKeyspace(keyspace)).hasFieldOrPropertyWithValue("keyspace", keyspace); + CqlSessionBuilder secondBuilder = context.getBean(CqlSessionBuilder.class); + assertThat(secondBuilder).hasFieldOrPropertyWithValue("keyspace", null); }); } diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc index ec7991564f7..e899f96f43b 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc @@ -4266,6 +4266,8 @@ Generally, you provide `keyspace-name` and `contact-points` as well the local da You can also register an arbitrary number of beans that implement `DriverConfigLoaderBuilderCustomizer` for more advanced driver customizations. The `CqlSession` can be customized with a bean of type `CqlSessionBuilderCustomizer`. +NOTE: If you're using `CqlSessionBuilder` to create multiple `CqlSession` beans, keep in mind the builder is mutable so make sure to inject a fresh copy for each session. + The following code listing shows how to inject a Cassandra bean: [source,java,indent=0]