The bean ‘redisTemplate‘, defined in class path resource

目录

1. bug描述

2. 出现的原因

3. 解决方式


1. bug描述

        The bean 'redisTemplate', defined in class path resource [com/kone/sp/common/redis2/config/RedisTemplateAutoConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration.class] and overriding is disabled.

 问题出现在我自定义 reids-starter 的时候

2. 出现的原因

        错误的原因是, springboot 在启动时会优先加载 springboot 框架自带的 spring.factories 文件中的定义的自动配置类, 把框架原本的 redisTemplate 作为 bean 注入到 容器中, 之后才会加载我们自定义的 RedisTemplateAutoConfiguration, 并且再次把我们魔改过 redisTemplate 注入到 bean 中, 这样容器中出现了2个名字一样的 redisTemplate, 所以会出现

Spring应用中,`RedisTemplate` Bean创建失败通常与依赖注入配置、Bean定义冲突或底层Redis连接配置错误有关。以下是可能导致该问题的常见原因及解决方案: ### 1. Redis连接工厂配置错误 `RedisTemplate` 依赖于 `RedisConnectionFactory`,如果该工厂未正确配置或未被注入,会导致 `RedisTemplate` 创建失败。确保在配置类中正确声明了 `RedisConnectionFactory` Bean,例如使用 `LettuceConnectionFactory` 或 `JedisConnectionFactory`: ```java @Bean public RedisConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379)); } ``` 同时,确保已启用Spring Data Redis的自动配置,或在配置类上添加 `@EnableRedisRepositories` 注解[^1]。 ### 2. Bean定义冲突或重复定义 如果存在多个 `RedisTemplate` 或 `RedisConnectionFactory` Bean定义,可能会导致冲突。检查 `@Bean` 注解的使用是否重复,或者在不同配置类中定义了相同的Bean。可以使用 `@Primary` 注解指定优先使用的Bean,例如: ```java @Bean @Primary public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } ``` ### 3. 序列化配置错误 `RedisTemplate` 默认使用 `JdkSerializationRedisSerializer`,若键或值未实现 `Serializable` 接口,可能导致序列化失败。建议根据实际数据类型配置合适的序列化器,如 `StringRedisSerializer` 或 `GenericJackson2JsonRedisSerializer` [^2]。 ### 4. Redis服务器未启动或网络不可达 若Redis服务器未运行或Spring应用无法连接到Redis实例,`RedisConnectionFactory` 初始化会失败,进而导致 `RedisTemplate` 创建失败。检查Redis服务器状态、主机名和端口配置,确保网络可达性。 ### 5. Spring Boot版本兼容性问题 在Spring Boot 2.6.0及以上版本中,默认禁用循环依赖支持,若存在循环依赖问题,可能导致 `RedisTemplate` Bean创建失败。可通过启用 `spring.main.allow-circular-references=true` 临时解决,但更推荐重构代码以消除循环依赖: ```yaml spring: main: allow-circular-references: true ``` ### 6. 自定义配置错误 如果在自定义配置类中修改了 `RedisTemplate` 的默认行为(如错误地覆盖了 `afterPropertiesSet()` 方法),可能会导致初始化失败。确保自定义逻辑正确无误,并遵循Spring官方文档中的推荐配置模式。 ### 示例:完整RedisTemplate配置 以下是一个完整的 `RedisTemplate` 配置示例,涵盖连接工厂、序列化器和Bean定义: ```java @Configuration public class RedisConfig { @Bean public RedisConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379)); } @Bean @Primary public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.afterPropertiesSet(); return template; } } ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值