一、该问题的重现步骤是什么?
1. 新建了一个工程,然后导入了cache和redis的依赖包
2. 启动时候提示redisCacheManager有两个实例化配置类
3.当我为了以上问题使用spring.main.allow-bean-definition-overriding: true来解决时候,发现CacheUtil无法使用了,报错如下:
二、你期待的结果是什么?实际看到的又是什么?
调试发现实际我们的cachemanager注入进来的不是RedisAutoCacheManager实例,而是JwtRedisConfiguration配置得到的redisCacheManager,这样就跟我们引入的blade-starter-redis里面的相冲突了,不是按照预期配置的序列化方式来操作redis缓存了。
现在不确定现在现在的加载逻辑,因为@AutoConfigureBefore({RedisAutoConfiguration.class}),RedisAutoConfiguration之前就先去加载了这个类JwtRedisConfiguration,那么我们的BladeRedisCacheAutoConfiguration加载时候岂不是永远都加载不到RedisAutoCacheManager,但是在我们的Blade项目里面确实正常的,首先就进入了BladeRedisCacheAutoConfiguration类去实例化正确的redisCacheManager。
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
Blade商业版 2.7.0 Windows
JwtRedisConfiguration有@Order注解的,也就是说他会最后加载,而BladeRedisCacheAutoConfiguration没有这个注解,不会最后加载。
他俩都有@AutoConfigureAfter(RedisAutoConfiguration.class),主要就是看@Order注解了。
如果两个依赖都引入,那最先实例化的应该是BladeRedisCacheAutoConfiguration才对。
如果你找不出问题,把你的新工程精简一下,只留关键配置,然后打包上传到本帖,我下载调试看看是哪里的问题
主要是看到两者注解不一样呢,一个是before一个是after
BladeRedisCacheAutoConfiguration使用的是@AutoConfigureAfter(RedisAutoConfiguration.class)
JwtRedisConfiguration使用的是@AutoConfigureBefore(RedisAutoConfiguration.class)我再去简化精简下看看效果
麻烦老铁看下第二个回复呢
我刚刚看了下我们的blade-biz的blade-demo的代码,发现默认也会首先进入JwtRedisConfiguration,但是当我把配置里面的@ComponentScan({"org.springblade", "com.example"})中的org.springblade,移除之后就会正常的进入到BladeRedisCacheAutoConfiguration
已经优化:https://center.bladex.cn/blade/BladeX-Tool/commit/ccc103f417fad1c262dd069ab7648f970f723442
你跟着commit修改下然后再测试看看
我看了下楼主曾经得回答,配置org.springblade的类底层已经做好自动装配了,在每个目录都有自定义bean,所以springblade根目录无需再次扫描,但是在我们得blade-biz得demo工程里面加了一个如下得config配置(@ComponentScan({"org.springblade","com.example"})),继而影响了原本加载CacheManager得实现名称redisCacheManager得bean我们应该把相应得把她去掉
@Configuration
@ComponentScan({"org.springblade","com.example"})
@EnableFeignClients({"org.springblade", "com.example"})
@MapperScan({"org.springblade.**.mapper.**", "com.example.**.mapper.**"})
@EnableConfigurationProperties(DemoProperties.class)
public class DemoConfiguration {
}
扫一扫访问 Blade技术社区 移动端