From 8f7efbe12a9ee1a564b4a1959b057e1d92430105 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 20 Dec 2016 20:57:50 -0800 Subject: [PATCH] Polish `spring.redis.url` support See gh-7395 --- .../data/redis/RedisAutoConfiguration.java | 65 +++++++++++-------- .../redis/RedisAutoConfigurationTests.java | 6 +- 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration.java index 5a42e7fd81..1c770888d5 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration.java @@ -22,8 +22,6 @@ import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.apache.commons.pool2.impl.GenericObjectPool; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPoolConfig; @@ -66,8 +64,6 @@ import org.springframework.util.StringUtils; @EnableConfigurationProperties(RedisProperties.class) public class RedisAutoConfiguration { - private static final Log logger = LogFactory.getLog(RedisAutoConfiguration.class); - /** * Redis connection configuration. */ @@ -98,29 +94,7 @@ public class RedisAutoConfiguration { protected final JedisConnectionFactory applyProperties( JedisConnectionFactory factory) { - if (StringUtils.hasText(this.properties.getUrl())) { - if (this.properties.getUrl().startsWith("rediss://")) { - factory.setUseSsl(true); - } - try { - URI redisURI = new URI(this.properties.getUrl()); - factory.setHostName(redisURI.getHost()); - factory.setPort(redisURI.getPort()); - if (redisURI.getUserInfo() != null) { - factory.setPassword(redisURI.getUserInfo().split(":", 2)[1]); - } - } - catch (URISyntaxException e) { - logger.error("Incorrect spring.redis.url", e); - } - } - else { - factory.setHostName(this.properties.getHost()); - factory.setPort(this.properties.getPort()); - if (this.properties.getPassword() != null) { - factory.setPassword(this.properties.getPassword()); - } - } + configureConnection(factory); if (this.properties.isSsl()) { factory.setUseSsl(true); } @@ -131,6 +105,43 @@ public class RedisAutoConfiguration { return factory; } + private void configureConnection(JedisConnectionFactory factory) { + if (StringUtils.hasText(this.properties.getUrl())) { + configureConnectionFromUrl(factory); + } + else { + factory.setHostName(this.properties.getHost()); + factory.setPort(this.properties.getPort()); + if (this.properties.getPassword() != null) { + factory.setPassword(this.properties.getPassword()); + } + } + } + + private void configureConnectionFromUrl(JedisConnectionFactory factory) { + String url = this.properties.getUrl(); + if (url.startsWith("rediss://")) { + factory.setUseSsl(true); + } + try { + URI uri = new URI(url); + factory.setHostName(uri.getHost()); + factory.setPort(uri.getPort()); + if (uri.getUserInfo() != null) { + String password = uri.getUserInfo(); + int index = password.lastIndexOf(":"); + if (index >= 0) { + password = password.substring(index + 1); + } + factory.setPassword(password); + } + } + catch (URISyntaxException ex) { + throw new IllegalArgumentException("Malformed 'spring.redis.url' " + url, + ex); + } + } + protected final RedisSentinelConfiguration getSentinelConfig() { if (this.sentinelConfiguration != null) { return this.sentinelConfiguration; diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java index 831e7b2809..69be81f6dc 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java @@ -41,6 +41,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Christian Dupuis * @author Christoph Strobl * @author EddĂș MelĂ©ndez + * @author Marco Aust */ public class RedisAutoConfigurationTests { @@ -76,10 +77,9 @@ public class RedisAutoConfigurationTests { } @Test - public void testOverrideURLRedisConfiguration() throws Exception { + public void testOverrideUrlRedisConfiguration() throws Exception { load("spring.redis.host:foo", "spring.redis.password:xyz", - "spring.redis.port:1000", - "spring.redis.ssl:true", + "spring.redis.port:1000", "spring.redis.ssl:true", "spring.redis.url:redis://user:password@example:33"); assertThat(this.context.getBean(JedisConnectionFactory.class).getHostName()) .isEqualTo("example");