栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot中注入RedisTemplate实例异常解决

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot中注入RedisTemplate实例异常解决

错误信息:

Error creating bean with name 'servlet02': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.data.redis.core.RedisTemplate' available: expected single matching bean but found 2: redisTemplate,stringRedisTemplate

原因 :

@Autowird注解是按照类型注入的,即Spring容器中的bean的class,@Resource是按照Spring容器中的id 名自动注入的

在Springboot这种使用redis,Spring容器中存在两个redis对象:

RedisTmplate 和 StringRedisTemplate

@RestController
@RequestMapping("/user2")
public class servlet02 {

// @Qualifier("redisTemplate")
@Autowired
private RedisTemplate redisTemplate; // 注入redis对象

@Resource
private StringRedisTemplate r1;

@RequestMapping("/id")
public void aa(){
System.out.println(redisTemplate.getClass());
System.out.println("-------");
System.out.println(r1.getClass());

}
}

运行结果:

因为StringRedisTemplate继承了类 : RedisTemplate

也就是说,程序在编译完成以后,会消除泛型的指定,最后程序中会出现两个 一样的RedisTemplate对象,

@RestController
@RequestMapping("/user2")
public class servlet02 {

// @Qualifier("redisTemplate")
@Autowired
private RedisTemplate redisTemplate0; // 注入redis对象

@Resource
private StringRedisTemplate r1;

@RequestMapping("/id")
public void aa(){
System.out.println(redisTemplate0.getClass());
// System.out.println("-------");
System.out.println(r1.getClass());

}
}

因为@Autowird是按照类型注入的,所以 会出现错误:

Field redisTemplate0 in com.controller.servlet02 required a single bean, but 2 were found:

- redisTemplate: defined by method 'redisTemplate' in class path resource

即存在两个RedisTemplate对象

如果把 @Autowird注解换成@Resource注解,会出现错误:

@Resource
private RedisTemplate redisTemplate0; // 注入redis对象

No qualifying bean of type 'org.springframework.data.redis.core.RedisTemplate' available: expected single matching bean but found 2:

解决办法有5种:

1、

@Autowired
private RedisTemplate redisTemplate; // 注入redis对象,必须是这个变量名

2、

@Qualifier("stringRedisTemplate")
@Autowired
private RedisTemplate r1; // 注入redis对象

3、

@Qualifier("redisTemplate")
@Autowired
private RedisTemplate r2;

4、

@Resource
private StringRedisTemplate r3;

5、

@Resource
private RedisTemplate r4;

ps : 我只是一名初学者,目前刚自学到Spring boot 阶段,在整合redis的时候遇到了这个问题,并且网上都没有给出有效的解决方案,所以就顺便发出来。因为我刚好在记录这个错误,所以就顺便发出来了

 

以上的结论纯属我个人猜测,虽然可能会有错误的地方,但是能找到解决方法,就说明应该没有错

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1010596.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号