当前位置:   article > 正文

Field redisTemplate in ... required a bean of type ...RedisTemplate' that could not be found.

redistemplate' that could not be found.

在springboot整合Redis的时候 ,项目无法启动,报:

Field redisTemplate in com.xzh.AccessLimitController required a bean of type 'org.springframework.data.redis.core.RedisTemplate' that could not be found.

我的RedisTemplate注入如下: 

  1. @Autowired
  2. private RedisTemplate<String,Integer> redisTemplate;

RedisConfig如下:

  1. @Configuration
  2. @EnableCaching
  3. public class RedisConfig {
  4. @Bean
  5. public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
  6. // 默认Redis缓存过期时间为1小时50分钟
  7. RedisCacheConfiguration redisCacheConfiguration =
  8. RedisCacheConfiguration.defaultCacheConfig()
  9. .entryTtl(Duration.ofMinutes(110));
  10. return RedisCacheManager
  11. .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
  12. .cacheDefaults(redisCacheConfiguration).build();
  13. }
  14. @Bean
  15. public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
  16. RedisTemplate<Object, Object> template = new RedisTemplate<>();
  17. template.setConnectionFactory(connectionFactory);
  18. //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
  19. Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
  20. ObjectMapper mapper = new ObjectMapper();
  21. mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  22. mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  23. serializer.setObjectMapper(mapper);
  24. template.setValueSerializer(serializer);
  25. //使用StringRedisSerializer来序列化和反序列化redis的key值
  26. template.setKeySerializer(new StringRedisSerializer());
  27. template.afterPropertiesSet();
  28. return template;
  29. }
  30. @Bean
  31. public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
  32. StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
  33. stringRedisTemplate.setConnectionFactory(factory);
  34. return stringRedisTemplate;
  35. }

奇怪的是,不带泛型的RedisTemplate是可以正常注入的。在网上查找解决方法,发现,将 @Autowired 换成 @Resource 就可以了

  1. @Resource
  2. private RedisTemplate<String, Integer> redisTemplate;

试了一下,果然成功啦。那么问题来了, @Autowired 和 @Resource 到底有啥区别呢?

请看:@Autowired 和 @Resource 的区别?

因为@Autowired是根据类型来注入的,泛型也被考虑进去了,显然,我们的RedisTemplate里并没有我想要注入的这一类型,所以报错了;@Resource默认根据名称注入,redisTemplate 这个bean在我们的RedisConfig里被加到了spring中,所以是可以被注入的。

既然知道了rootcause,那么解决方法就很多了,一定要使用@Autowired也是可以的,只要spring容器中有我们需要的类型的RedisTemple就可以啦:

  1. @Bean
  2. public RedisTemplate<String, Integer> redisTemplate(RedisConnectionFactory connectionFactory) {
  3. RedisTemplate<String, Integer> template = new RedisTemplate<>();
  4. template.setConnectionFactory(connectionFactory);
  5. //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
  6. Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(String.class);
  7. ObjectMapper mapper = new ObjectMapper();
  8. mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  9. mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  10. serializer.setObjectMapper(mapper);
  11. template.setValueSerializer(serializer);
  12. //使用StringRedisSerializer来序列化和反序列化redis的key值
  13. template.setKeySerializer(new StringRedisSerializer());
  14. template.afterPropertiesSet();
  15. return template;
  16. }

有的同学可能要说啦,用@Autowired 配合@Qualifier 使用,不也是按名称注入的吗,但是忽略了一点是,虽然这样使用它会按名称找bean,但是它还是有bean 类型的限制的,看下面的提示就知道啦:

 

事实证明,这样是OK的,所以解决问题最重要的一个环节就是找到造成问题的原因,一旦知道了,解决起来就很简单了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/125762
推荐阅读
相关标签
  

闽ICP备14008679号