Reputation: 111
I am trying to create a custom ReactiveRedisTemplate in my Spring Boot application with a specific configuration for String keys and Object values. My goal is to override the default ReactiveRedisTemplate<Object, Object>
provided by Spring's RedisReactiveAutoConfiguration.
@AutoConfigureBefore(RedisReactiveAutoConfiguration.class)
public class CustomReactiveAutoConfiguration {
@Bean
@ConditionalOnBean(ReactiveRedisConnectionFactory.class)
public ReactiveRedisTemplate<String, Object> reactiveRedisTemplate(
ReactiveRedisConnectionFactory connectionFactory, ResourceLoader resourceLoader) {
RedisSerializer<String> stringSerializer = RedisSerializer.string();
RedisSerializer<Object> javaSerializer = RedisSerializer.java(resourceLoader.getClassLoader());
RedisSerializationContext<String, Object> serializationContext = RedisSerializationContext
.<String, Object>newSerializationContext(stringSerializer)
.key(stringSerializer)
.value(javaSerializer)
.hashKey(stringSerializer)
.hashValue(javaSerializer)
.build();
return new ReactiveRedisTemplate<>(connectionFactory, serializationContext);
}
}
By using @AutoConfigureBefore(RedisReactiveAutoConfiguration.class), I expected my custom ReactiveRedisTemplate<String, Object> to be created first, and the default ReactiveRedisTemplate<Object, Object> bean to back off, as the default configuration uses @ConditionalOnMissingBean.
However, I encounter the following exception at runtime:
Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: ...
Invalid bean definition with name 'reactiveRedisTemplate' defined in CustomReactiveAutoConfiguration: ...
since there is already defined in org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration]
What I Have Tried
@AutoConfigureBefore
: I annotated my custom configuration class with @AutoConfigureBefore(RedisReactiveAutoConfiguration.class) to ensure it runs before the default configuration. This did not resolve the issue.
Avoiding BeanPostProcessor
: I want to avoid using a BeanPostProcessor since it would involve casting the object, which is something I want to avoid.
Using BeanDefinitionRegistryPostProcessor
: I attempted to remove the default bean definition using BeanDefinitionRegistryPostProcessor to manually unregister the default reactiveRedisTemplate bean before registering my custom one. Despite this, the error persists.
Excluding RedisReactiveAutoConfiguration
: I do not want to exclude the entire RedisReactiveAutoConfiguration class as I still need the ReactiveStringRedisTemplate bean created by it.
Upvotes: 0
Views: 67