diff --git a/redisson-spring-boot-starter/src/main/java/org/redisson/spring/starter/PropertiesRedisConnectionDetails.java b/redisson-spring-boot-starter/src/main/java/org/redisson/spring/starter/PropertiesRedisConnectionDetails.java new file mode 100644 index 000000000..da46b7fc7 --- /dev/null +++ b/redisson-spring-boot-starter/src/main/java/org/redisson/spring/starter/PropertiesRedisConnectionDetails.java @@ -0,0 +1,141 @@ +/** + * Copyright (c) 2013-2022 Nikita Koksharov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * Copyright 2012-2023 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.redisson.spring.starter; + +import org.redisson.misc.RedisURI; +import org.springframework.boot.autoconfigure.data.redis.RedisConnectionDetails; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * Adapts {@link RedisProperties} to {@link RedisConnectionDetails}. + * + * @author Moritz Halbritter + * @author Andy Wilkinson + * @author Phillip Webb + * @author Scott Frederick + * @author Nikita Koksharov + */ +public class PropertiesRedisConnectionDetails implements RedisConnectionDetails { + + private final RedisProperties properties; + + PropertiesRedisConnectionDetails(RedisProperties properties) { + this.properties = properties; + } + + @Override + public String getUsername() { + if (this.properties.getUrl() != null) { + RedisURI uri = parseURL(); + return uri.getUsername(); + } + return this.properties.getUsername(); + } + + @Override + public String getPassword() { + if (this.properties.getUrl() != null) { + RedisURI uri = parseURL(); + return uri.getPassword(); + } + return this.properties.getPassword(); + } + + @Override + public Standalone getStandalone() { + if (this.properties.getUrl() != null) { + RedisURI uri = parseURL(); + return Standalone.of(uri.getHost(), uri.getPort(), + this.properties.getDatabase()); + } + return Standalone.of(this.properties.getHost(), this.properties.getPort(), this.properties.getDatabase()); + } + + private RedisURI parseURL() { + if (this.properties.getUrl() != null) { + return new RedisURI(this.properties.getUrl()); + } + return null; + } + + @Override + public Sentinel getSentinel() { + RedisProperties.Sentinel sentinel = this.properties + .getSentinel(); + if (sentinel == null) { + return null; + } + return new Sentinel() { + + @Override + public int getDatabase() { + return PropertiesRedisConnectionDetails.this.properties.getDatabase(); + } + + @Override + public String getMaster() { + return sentinel.getMaster(); + } + + @Override + public List getNodes() { + return sentinel.getNodes().stream().map(PropertiesRedisConnectionDetails.this::asNode).collect(Collectors.toList()); + } + + @Override + public String getUsername() { + return sentinel.getUsername(); + } + + @Override + public String getPassword() { + return sentinel.getPassword(); + } + + }; + } + + @Override + public Cluster getCluster() { + RedisProperties.Cluster cluster = this.properties.getCluster(); + List nodes = (cluster != null) ? cluster.getNodes().stream().map(this::asNode).collect(Collectors.toList()) : null; + return (nodes != null) ? () -> nodes : null; + } + + private Node asNode(String node) { + String[] components = node.split(":"); + return new Node(components[0], Integer.parseInt(components[1])); + } + +} diff --git a/redisson-spring-boot-starter/src/main/java/org/redisson/spring/starter/RedissonAutoConfiguration.java b/redisson-spring-boot-starter/src/main/java/org/redisson/spring/starter/RedissonAutoConfiguration.java index c55d72b21..1ced5efec 100644 --- a/redisson-spring-boot-starter/src/main/java/org/redisson/spring/starter/RedissonAutoConfiguration.java +++ b/redisson-spring-boot-starter/src/main/java/org/redisson/spring/starter/RedissonAutoConfiguration.java @@ -21,13 +21,13 @@ import org.redisson.api.RedissonReactiveClient; import org.redisson.api.RedissonRxClient; import org.redisson.config.*; import org.redisson.spring.data.connection.RedissonConnectionFactory; -import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisConnectionDetails; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Sentinel; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -80,6 +80,13 @@ public class RedissonAutoConfiguration { @Autowired private ApplicationContext ctx; + @Bean + @ConditionalOnClass(RedisConnectionDetails.class) + @ConditionalOnMissingBean(RedisConnectionDetails.class) + Object redisConnectionDetails(RedisProperties properties) { + return new PropertiesRedisConnectionDetails(properties); + } + @Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {