错误信息:

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

redis cli未找到命令 redistemplate找不到_spring boot

原因 :

@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());

}
}

运行结果:

redis cli未找到命令 redistemplate找不到_redis cli未找到命令_02

因为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());

}
}

redis cli未找到命令 redistemplate找不到_java_03

因为@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:

redis cli未找到命令 redistemplate找不到_redis cli未找到命令_04

解决办法有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的时候遇到了这个问题,并且网上都没有给出有效的解决方案,所以就顺便发出来。因为我刚好在记录这个错误,所以就顺便发出来了

redis cli未找到命令 redistemplate找不到_spring boot_05

 

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