Skip to content

Commit 71281a2

Browse files
committed
fix: resolve Spring Boot 4.0.0 compatibility issues (#697)
Fix two issues reported when using Redis OM Spring 2.0.0 with Spring Boot 4.0.0: 1. Bean definition conflict: Update RedisRepositoriesExcludeFilter to exclude the new modular autoconfiguration class name used in Spring Boot 4.0 (DataRedisRepositoriesAutoConfiguration) in addition to the legacy class name. 2. Missing JedisConnectionFactory: Add JedisConnectionFactory and StringRedisTemplate beans to RedisModulesConfiguration that are created when Spring Boot's Redis autoconfiguration is not present. This ensures Redis OM Spring works regardless of whether spring-boot-data-redis is explicitly included. Also fix spring.factories formatting (missing line continuation backslash).
1 parent 9dac9e6 commit 71281a2

File tree

3 files changed

+68
-2
lines changed

3 files changed

+68
-2
lines changed

redis-om-spring/src/main/java/com/redis/om/spring/RedisModulesConfiguration.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@
2222
import org.springframework.context.annotation.*;
2323
import org.springframework.context.event.ContextRefreshedEvent;
2424
import org.springframework.context.event.EventListener;
25+
import org.springframework.core.env.Environment;
2526
import org.springframework.data.geo.Point;
27+
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
28+
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
2629
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
2730
import org.springframework.data.redis.core.RedisHash;
2831
import org.springframework.data.redis.core.RedisOperations;
@@ -132,6 +135,66 @@ public RedisEnhancedMappingContext redisMappingContext() {
132135
return new RedisEnhancedMappingContext();
133136
}
134137

138+
/**
139+
* Creates a Jedis connection factory for Redis connectivity.
140+
* <p>
141+
* This bean is required by Redis OM Spring for Redis Stack modules support.
142+
* It will be created if no JedisConnectionFactory bean exists, ensuring
143+
* Jedis is used instead of Lettuce (which is Spring Boot 4.0's default).
144+
* <p>
145+
* Connection settings are read from standard Spring Data Redis properties:
146+
* <ul>
147+
* <li>{@code spring.data.redis.host} - Redis server host (default: localhost)</li>
148+
* <li>{@code spring.data.redis.port} - Redis server port (default: 6379)</li>
149+
* <li>{@code spring.data.redis.password} - Redis password (optional)</li>
150+
* <li>{@code spring.data.redis.database} - Redis database index (default: 0)</li>
151+
* </ul>
152+
*
153+
* @param environment the Spring environment for reading configuration properties
154+
* @return the configured Jedis connection factory
155+
*/
156+
@Bean(
157+
name = "jedisConnectionFactory"
158+
)
159+
@Primary
160+
@ConditionalOnMissingBean(
161+
JedisConnectionFactory.class
162+
)
163+
public JedisConnectionFactory jedisConnectionFactory(Environment environment) {
164+
String host = environment.getProperty("spring.data.redis.host", "localhost");
165+
int port = environment.getProperty("spring.data.redis.port", Integer.class, 6379);
166+
String password = environment.getProperty("spring.data.redis.password");
167+
int database = environment.getProperty("spring.data.redis.database", Integer.class, 0);
168+
169+
RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration(host, port);
170+
redisConfig.setDatabase(database);
171+
if (password != null && !password.isEmpty()) {
172+
redisConfig.setPassword(password);
173+
}
174+
175+
JedisClientConfiguration clientConfig = JedisClientConfiguration.builder().build();
176+
177+
return new JedisConnectionFactory(redisConfig, clientConfig);
178+
}
179+
180+
/**
181+
* Creates a StringRedisTemplate for string-based Redis operations.
182+
* <p>
183+
* This bean is required by Redis OM Spring and will be created if Spring Boot's
184+
* Redis autoconfiguration hasn't already created one. It uses the JedisConnectionFactory
185+
* for connectivity.
186+
*
187+
* @param connectionFactory the Jedis connection factory
188+
* @return the configured StringRedisTemplate
189+
*/
190+
@Bean
191+
@ConditionalOnMissingBean(
192+
StringRedisTemplate.class
193+
)
194+
public StringRedisTemplate stringRedisTemplate(JedisConnectionFactory connectionFactory) {
195+
return new StringRedisTemplate(connectionFactory);
196+
}
197+
135198
/**
136199
* Creates a configured Gson builder for JSON serialization and deserialization.
137200
* <p>

redis-om-spring/src/main/java/com/redis/om/spring/RedisRepositoriesExcludeFilter.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ public RedisRepositoriesExcludeFilter() {
3333
}
3434

3535
private static final Set<String> SHOULD_SKIP = new HashSet<>(List.of(
36-
"org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration"));
36+
// Spring Boot 3.x class name
37+
"org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration",
38+
// Spring Boot 4.0+ class name (modular autoconfigure)
39+
"org.springframework.boot.data.redis.autoconfigure.DataRedisRepositoriesAutoConfiguration"));
3740

3841
@Override
3942
public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) {

redis-om-spring/src/main/resources/META-INF/spring.factories

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Auto Configure
22
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
3-
com.redis.om.spring.RedisModulesConfiguration
3+
com.redis.om.spring.RedisModulesConfiguration,\
44
com.redis.om.spring.EntraIDConfiguration
55
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
66
com.redis.om.spring.RedisRepositoriesExcludeFilter

0 commit comments

Comments
 (0)