2shar
2shar

Reputation: 111

How to Override Spring's Default ReactiveRedisTemplate with Custom AutoConfiguration Without Bean Override Exception?

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

Answers (0)

Related Questions