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 161a03869cc..6bd25aa01fd 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 @@ -114,6 +114,8 @@ public class CassandraAutoConfiguration { mapPoolingOptions(properties, options); map.from(properties::getContactPoints) .to((contactPoints) -> options.add(DefaultDriverOption.CONTACT_POINTS, contactPoints)); + map.from(properties.getLocalDatacenter()).to( + (localDatacenter) -> options.add(DefaultDriverOption.LOAD_BALANCING_LOCAL_DATACENTER, localDatacenter)); ConfigFactory.invalidateCaches(); return ConfigFactory.defaultOverrides().withFallback(options.build()) .withFallback(ConfigFactory.defaultReference()).resolve(); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraProperties.java index 1214ebbee13..c5fe7596b6b 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraProperties.java @@ -55,6 +55,12 @@ public class CassandraProperties { */ private final List contactPoints = new ArrayList<>(Collections.singleton("127.0.0.1:9042")); + /** + * Datacenter that is considered "local". Contact points should be from this + * datacenter. + */ + private String localDatacenter; + /** * Login user of the server. */ @@ -141,6 +147,14 @@ public class CassandraProperties { return this.contactPoints; } + public String getLocalDatacenter() { + return this.localDatacenter; + } + + public void setLocalDatacenter(String localDatacenter) { + this.localDatacenter = localDatacenter; + } + public String getUsername() { return this.username; } 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 9a139ab28da..e2f1be8027e 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 @@ -51,6 +51,20 @@ class CassandraAutoConfigurationTests { }); } + @Test + void driverConfigLoaderWithContactPoints() { + this.contextRunner.withPropertyValues("spring.data.cassandra.contact-points=cluster.example.com:9042", + "spring.data.cassandra.local-datacenter=cassandra-eu1").run((context) -> { + assertThat(context).hasSingleBean(DriverConfigLoader.class); + DriverExecutionProfile configuration = context.getBean(DriverConfigLoader.class).getInitialConfig() + .getDefaultProfile(); + assertThat(configuration.getStringList(DefaultDriverOption.CONTACT_POINTS)) + .containsOnly("cluster.example.com:9042"); + assertThat(configuration.getString(DefaultDriverOption.LOAD_BALANCING_LOCAL_DATACENTER)) + .isEqualTo("cassandra-eu1"); + }); + } + @Test void driverConfigLoaderWithCustomSessionName() { this.contextRunner.withPropertyValues("spring.data.cassandra.session-name=testcluster").run((context) -> { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java index ffd637d7f84..1338fb25f9d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java @@ -29,12 +29,9 @@ import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.boot.autoconfigure.AutoConfigurationPackages; import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration; -import org.springframework.boot.autoconfigure.cassandra.CqlSessionBuilderCustomizer; import org.springframework.boot.autoconfigure.data.cassandra.city.City; import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.data.cassandra.config.SchemaAction; import org.springframework.data.cassandra.config.SessionFactoryFactoryBean; @@ -58,9 +55,9 @@ class CassandraDataAutoConfigurationIntegrationTests { @BeforeEach void setUp() { this.context = new AnnotationConfigApplicationContext(); - this.context.register(TestConfiguration.class); TestPropertyValues .of("spring.data.cassandra.contact-points:localhost:" + cassandra.getFirstMappedPort(), + "spring.data.cassandra.local-datacenter=datacenter1", "spring.data.cassandra.read-timeout=24000", "spring.data.cassandra.connect-timeout=10000") .applyTo(this.context.getEnvironment()); } @@ -105,14 +102,4 @@ class CassandraDataAutoConfigurationIntegrationTests { } } - @Configuration - static class TestConfiguration { - - @Bean - CqlSessionBuilderCustomizer sessionCustomizer() { - return (builder) -> builder.withLocalDatacenter("datacenter1"); - } - - } - }