错误信息:
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<String, String>
也就是说,程序在编译完成以后,会消除泛型的指定,最后程序中会出现两个 一样的RedisTemplate对象,
@RestController
@RequestMapping("/user2")
public class servlet02 {
// @Qualifier("redisTemplate")
@Autowired
private RedisTemplate<String,String> 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<String,String> r4;
ps : 我只是一名初学者,目前刚自学到Spring boot 阶段,在整合redis的时候遇到了这个问题,并且网上都没有给出有效的解决方案,所以就顺便发出来。因为我刚好在记录这个错误,所以就顺便发出来了
以上的结论纯属我个人猜测,虽然可能会有错误的地方,但是能找到解决方法,就说明应该没有错