Bean named 'redisTemplate' is expected to be of type 'org.springframework.data.redis.core.StringRedisTemplate' but was actually of type 'org.springframework.data.redis.core.RedisTemplate'
1、问题
SpringBoot版本升级,项目启动报错如下:
Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named ‘redisTemplate’ is expected to be of type ‘org.springframework.data.redis.core.StringRedisTemplate’ but was actually of type ‘org.springframework.data.redis.core.RedisTemplate’
2、原因
注解问题
@Autowired
- 1、这个注解是spring提供的
- 2、按照type查找bean,他是在spring容器中去查找有没有这个type的bean
- 3、如果我们使用@Qualifier注解声明了name,则从结果集中取出与该name相匹配的bean返回(此时可以视为通过name和type获取bean,但实质是先通过type获取所有bean,然后通过name筛选
- 4、如果没有使用@Qualifier注解,且找到多个bean,则判断这些bean中是否有使用@Primary注解和@Priority注解,有就返回优先级最高的哪一个bean,没有就按照字段名称去匹配bean,匹配成功返回,不成功抛出异常。
如果还需要详细的了解,可以去查看一下源码 findAutowireCandidates()和determineAutowireCandidate()这个两个方法的源码
@Resource
- 1、这个注解是由jdk提供的
- 2、按照name属性查找,如果我们没有指定name属性,则会把name属性值处理为字段名
- 3、先按照name属性值注入,若未找到,则按照type属性值注入
3、解决
原集成redis时,使用如下:
@Autowired
private StringRedisTemplate redisTemplate;
建议替换成 Resource ,该注解是JDK内部的注解,不会向@Autowired那样去Spring容器中寻找bean。
@Resource
private StringRedisTemplate redisTemplate;
也可以替换成 @Repository ,这个注解是Spring的注解,作用是把当前类注册到Srping容器中实例化为一个bean,这样的话@Autowired就可以找到这个bean了
这里如果是我们的工具类的话,建议使用 @Component 这个注解,因为上面注解主要用于dao层,用来确定类的标识作用(约定)
问题解决。
OK,就这些吧。
有什么不对的还望指正,书写不易,觉得有帮助就点个赞吧!☺☺☺
参考链接:https://blog.csdn.net/hh_lew/article/details/135026737