[Redis]a bean of type ‘...RedisTemplate‘ that could not be found

206 阅读1分钟

在使用 Spring Data Redis 框架时,需要使用 RedisTemplate 对象来实现操作的 Redis,需要使用 Spring 来注入 RedisTemplate

@Autowired
private RedisTemplate<String, Object> redisTemplate;

但是这样的注入方式是错误的,@Autowired 注解是根据类型进行注入,Spring 会从 IoC 容器中找到对应类型的 Bean 然后给域赋值,但是注意在这里声明的是 RedisTemplate<String, Object>,多了一个泛型,而 IoC 容器里面并没有声明这个 Bean,所以无法实现注入,容器自动装配的是 RedisTemplate<Object, Object>,所以会报错:

No qualifying bean of type ‘org.springframework.data.redis.core.RedisTemplate< java.lang.String, java.lang.Object>

最简单的解决方法就是去掉泛型,这样就不会报错了,但是 IDEA 会给出令人不舒服的警告,强迫症患者会十分难受。是否有其他解决方法呢?

肯定有的,那就是使用 @Resource 注解,@Resource 注解是根据 id 进行注入,假如没有找到对应的类型的 Bean,那么就会去找有对应的 id 的 Bean 进行注入。所以 @Resource 注解更加万能一点。

@Resource
private RedisTemplate<String, Object> redisTemplate;

最后还有一种比较麻烦的方式,那就是自己配置 RedisTemplate<String, Object> Bean。需要声明一个 Redis 配置类,声明需要的 Bean,这种方式多数是在你需要定制化 Spring Data Redis 的序列化方式的时候使用,比如指定 JSON 解析器 Bean。这样就可以使用 @Autowired 注解了。