diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java index af47306b907..19eb353a86c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java @@ -17,7 +17,6 @@ package org.springframework.boot.autoconfigure.data.redis; import java.net.UnknownHostException; -import java.time.Duration; import org.apache.commons.pool2.impl.GenericObjectPool; import redis.clients.jedis.Jedis; @@ -27,6 +26,7 @@ import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.PropertyMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisClusterConfiguration; @@ -89,20 +89,11 @@ class JedisConnectionConfiguration extends RedisConnectionConfiguration { } private JedisClientConfigurationBuilder applyProperties(JedisClientConfigurationBuilder builder) { - if (getProperties().isSsl()) { - builder.useSsl(); - } - Duration connectionTimeout = getProperties().getConnectionTimeout(); - if (connectionTimeout != null) { - builder.connectTimeout(connectionTimeout); - } - Duration timeout = getProperties().getTimeout(); - if (timeout != null) { - builder.readTimeout(timeout); - } - if (StringUtils.hasText(getProperties().getClientName())) { - builder.clientName(getProperties().getClientName()); - } + PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull(); + map.from(getProperties().isSsl()).whenTrue().toCall(builder::useSsl); + map.from(getProperties().getTimeout()).to(builder::readTimeout); + map.from(getProperties().getConnectTimeout()).to(builder::connectTimeout); + map.from(getProperties().getClientName()).whenHasText().to(builder::clientName); return builder; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java index b2aafb3027c..a813084f44e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java @@ -98,15 +98,7 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration { if (StringUtils.hasText(getProperties().getUrl())) { customizeConfigurationFromUrl(builder); } - - ClientOptions.Builder clientOptionsBuilder = initializeClientOptionsBuilder(); - Duration connectionTimeout = getProperties().getConnectionTimeout(); - if (connectionTimeout != null) { - SocketOptions socketOptions = SocketOptions.builder().connectTimeout(connectionTimeout).build(); - clientOptionsBuilder.socketOptions(socketOptions); - } - builder.clientOptions(clientOptionsBuilder.timeoutOptions(TimeoutOptions.enabled()).build()); - + builder.clientOptions(createClientOptions()); builder.clientResources(clientResources); builderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); return builder.build(); @@ -124,9 +116,8 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration { if (getProperties().isSsl()) { builder.useSsl(); } - Duration timeout = getProperties().getTimeout(); - if (timeout != null) { - builder.commandTimeout(timeout); + if (getProperties().getTimeout() != null) { + builder.commandTimeout(getProperties().getTimeout()); } if (getProperties().getLettuce() != null) { RedisProperties.Lettuce lettuce = getProperties().getLettuce(); @@ -140,6 +131,15 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration { return builder; } + private ClientOptions createClientOptions() { + ClientOptions.Builder builder = initializeClientOptionsBuilder(); + Duration connectTimeout = getProperties().getConnectTimeout(); + if (connectTimeout != null) { + builder.socketOptions(SocketOptions.builder().connectTimeout(connectTimeout).build()); + } + return builder.timeoutOptions(TimeoutOptions.enabled()).build(); + } + private ClientOptions.Builder initializeClientOptionsBuilder() { if (getProperties().getCluster() != null) { ClusterClientOptions.Builder builder = ClusterClientOptions.builder(); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java index 0e665f19b27..a9607fda4c9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java @@ -74,7 +74,7 @@ public class RedisProperties { /** * Connection timeout. */ - private Duration connectionTimeout; + private Duration connectTimeout; /** * Client name to be set on connections with CLIENT SETNAME. @@ -150,12 +150,12 @@ public class RedisProperties { return this.timeout; } - public Duration getConnectionTimeout() { - return this.connectionTimeout; + public Duration getConnectTimeout() { + return this.connectTimeout; } - public void setConnectionTimeout(Duration connectionTimeout) { - this.connectionTimeout = connectionTimeout; + public void setConnectTimeout(Duration connectTimeout) { + this.connectTimeout = connectTimeout; } public String getClientName() { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationJedisTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationJedisTests.java index f4e3cf6085e..4d44b2a6380 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationJedisTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationJedisTests.java @@ -16,14 +16,13 @@ package org.springframework.boot.autoconfigure.data.redis; -import io.lettuce.core.RedisClient; import org.junit.jupiter.api.Test; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.testsupport.classpath.ClassPathExclusions; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; @@ -38,11 +37,11 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Mark Paluch * @author Stephane Nicoll */ +@ClassPathExclusions("lettuce-core-*.jar") class RedisAutoConfigurationJedisTests { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class)) - .withClassLoader(new FilteredClassLoader(RedisClient.class)); + .withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class)); @Test void connectionFactoryDefaultsToJedis() { @@ -137,9 +136,9 @@ class RedisAutoConfigurationJedisTests { } @Test - void testRedisConfigurationWithTimeoutAndConnectionTimeout() { + void testRedisConfigurationWithTimeoutAndConnectTimeout() { this.contextRunner.withPropertyValues("spring.redis.host:foo", "spring.redis.timeout:250", - "spring.redis.connection-timeout:1000").run((context) -> { + "spring.redis.connect-timeout:1000").run((context) -> { JedisConnectionFactory cf = context.getBean(JedisConnectionFactory.class); assertThat(cf.getHostName()).isEqualTo("foo"); assertThat(cf.getTimeout()).isEqualTo(250); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java index 835ad98755b..b0095a94b17 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java @@ -168,15 +168,14 @@ class RedisAutoConfigurationTests { } @Test - void testRedisConfigurationWithTimeoutAndConnectionTimeout() { + void testRedisConfigurationWithTimeoutAndConnectTimeout() { this.contextRunner.withPropertyValues("spring.redis.host:foo", "spring.redis.timeout:250", - "spring.redis.connection-timeout:1000").run((context) -> { + "spring.redis.connect-timeout:1000").run((context) -> { LettuceConnectionFactory cf = context.getBean(LettuceConnectionFactory.class); assertThat(cf.getHostName()).isEqualTo("foo"); assertThat(cf.getTimeout()).isEqualTo(250); - long actualConnectionTimeout = cf.getClientConfiguration().getClientOptions().get() - .getSocketOptions().getConnectTimeout().toMillis(); - assertThat(actualConnectionTimeout).isEqualTo(1000); + assertThat(cf.getClientConfiguration().getClientOptions().get().getSocketOptions() + .getConnectTimeout().toMillis()).isEqualTo(1000); }); } @@ -186,9 +185,8 @@ class RedisAutoConfigurationTests { LettuceConnectionFactory cf = context.getBean(LettuceConnectionFactory.class); assertThat(cf.getHostName()).isEqualTo("foo"); assertThat(cf.getTimeout()).isEqualTo(60000); - long actualConnectionTimeout = cf.getClientConfiguration().getClientOptions().get().getSocketOptions() - .getConnectTimeout().toMillis(); - assertThat(actualConnectionTimeout).isEqualTo(10000); + assertThat(cf.getClientConfiguration().getClientOptions().get().getSocketOptions().getConnectTimeout() + .toMillis()).isEqualTo(10000); }); }