diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/PropertiesRedisConnectionDetails.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/PropertiesRedisConnectionDetails.java index 458baa938191..d04be4610b97 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/PropertiesRedisConnectionDetails.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/PropertiesRedisConnectionDetails.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ * @author Andy Wilkinson * @author Phillip Webb * @author Scott Frederick + * @author Yanming Zhou */ class PropertiesRedisConnectionDetails implements RedisConnectionDetails { @@ -39,7 +40,7 @@ class PropertiesRedisConnectionDetails implements RedisConnectionDetails { @Override public String getUsername() { if (this.properties.getUrl() != null) { - ConnectionInfo connectionInfo = connectionInfo(this.properties.getUrl()); + ConnectionInfo connectionInfo = RedisConnectionConfiguration.parseUrl(this.properties.getUrl()); return connectionInfo.getUsername(); } return this.properties.getUsername(); @@ -48,7 +49,7 @@ public String getUsername() { @Override public String getPassword() { if (this.properties.getUrl() != null) { - ConnectionInfo connectionInfo = connectionInfo(this.properties.getUrl()); + ConnectionInfo connectionInfo = RedisConnectionConfiguration.parseUrl(this.properties.getUrl()); return connectionInfo.getPassword(); } return this.properties.getPassword(); @@ -57,17 +58,14 @@ public String getPassword() { @Override public Standalone getStandalone() { if (this.properties.getUrl() != null) { - ConnectionInfo connectionInfo = connectionInfo(this.properties.getUrl()); + ConnectionInfo connectionInfo = RedisConnectionConfiguration.parseUrl(this.properties.getUrl()); return Standalone.of(connectionInfo.getUri().getHost(), connectionInfo.getUri().getPort(), - this.properties.getDatabase()); + connectionInfo.getDatabase() != null ? connectionInfo.getDatabase() + : this.properties.getDatabase()); } return Standalone.of(this.properties.getHost(), this.properties.getPort(), this.properties.getDatabase()); } - private ConnectionInfo connectionInfo(String url) { - return (url != null) ? RedisConnectionConfiguration.parseUrl(url) : null; - } - @Override public Sentinel getSentinel() { org.springframework.boot.autoconfigure.data.redis.RedisProperties.Sentinel sentinel = this.properties diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration.java index 8d25cc49d130..ba6aac6163e6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -45,6 +45,7 @@ * @author Moritz Halbritter * @author Andy Wilkinson * @author Phillip Webb + * @author Yanming Zhou */ abstract class RedisConnectionConfiguration { @@ -200,7 +201,12 @@ static ConnectionInfo parseUrl(String url) { password = candidate; } } - return new ConnectionInfo(uri, useSsl, username, password); + Integer database = null; + String[] pathSplit = uri.getPath().split("/", 2); + if (pathSplit.length > 1 && !pathSplit[1].isEmpty()) { + database = Integer.parseInt(pathSplit[1]); + } + return new ConnectionInfo(uri, useSsl, username, password, database); } catch (URISyntaxException ex) { throw new RedisUrlSyntaxException(url, ex); @@ -217,11 +223,14 @@ static class ConnectionInfo { private final String password; - ConnectionInfo(URI uri, boolean useSsl, String username, String password) { + private final Integer database; + + ConnectionInfo(URI uri, boolean useSsl, String username, String password, Integer database) { this.uri = uri; this.useSsl = useSsl; this.username = username; this.password = password; + this.database = database; } URI getUri() { @@ -240,6 +249,10 @@ String getPassword() { return this.password; } + Integer getDatabase() { + return this.database; + } + } } 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 27b0f54a4b76..6fbd7cba4048 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 @@ -31,6 +31,7 @@ * @author Mark Paluch * @author Stephane Nicoll * @author Scott Frederick + * @author Yanming Zhou * @since 1.0.0 */ @ConfigurationProperties(prefix = "spring.data.redis") @@ -42,8 +43,8 @@ public class RedisProperties { private int database = 0; /** - * Connection URL. Overrides host, port, username, and password. Example: - * redis://user:password@example.com:6379 + * Connection URL. Overrides host, port, username, password, and database. Example: + * redis://user:password@example.com:6379/8 */ private String url; diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/PropertiesRedisConnectionDetailsTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/PropertiesRedisConnectionDetailsTests.java index 4d3aa55ab84f..7f1ea52008ce 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/PropertiesRedisConnectionDetailsTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/PropertiesRedisConnectionDetailsTests.java @@ -103,7 +103,7 @@ void standaloneIsConfiguredFromUrl() { RedisConnectionDetails.Standalone standalone = connectionDetails.getStandalone(); assertThat(standalone.getHost()).isEqualTo("example.com"); assertThat(standalone.getPort()).isEqualTo(1234); - assertThat(standalone.getDatabase()).isEqualTo(5); + assertThat(standalone.getDatabase()).isEqualTo(9999); } @Test