网页设计的网站配色方案,广告设计在线设计,阿里云 wordpress 503,互联网公司排名1000温馨提示#xff1a;图片有点小#xff0c;可以放大页面进行查看...
问题1#xff1a;版本冲突
直接上图#xff0c;这个错表示依赖版本不匹配问题#xff0c;我本地SpringBoot用的是2.7#xff0c;但是Redisson版本用的3.32.5。 我们通过点击 artifactId跟进去 发现它…温馨提示图片有点小可以放大页面进行查看...
问题1版本冲突
直接上图这个错表示依赖版本不匹配问题我本地SpringBoot用的是2.7但是Redisson版本用的3.32.5。 我们通过点击 artifactId跟进去 发现它依赖的SpringBoot版本是3.1 换成3.18.0之后就好了 大家碰到NotClassDefFoundError 就优先考虑依赖版本问题连类定义都没有太离谱了... 问题2循环依赖
这个错误还是很容易就复现出来的... 这里放大关键报错信息 我在RedisConfig中同时完成RedisTemplate和RedissonClient的初始化。
因为我通过字段注入RedissonConnectionFactory。
当其他类需要redisTemplate的时候即依赖RedisConfig去完成Bean注册的时候发现redisTemplate依赖RedissonConnectionFactory而RedissonConnectionFactory依赖RedissonClient而RedissonClient依赖RedisConfig。走了一圈发现RedisConfig依赖RedisConfig所以产生了循环依赖。
Configuration
public class RedisConfig {Autowiredprivate RedissonConnectionFactory fa;Value(${spring.redis.host})private String host;Value(${spring.redis.port})private Integer port;Value(${spring.redis.password})private String password;Beanpublic RedisTemplateString, Object redisTemplate(RedissonConnectionFactory factory) {Jackson2JsonRedisSerializerObject jackson2JsonRedisSerializer new Jackson2JsonRedisSerializerObject(Object.class);ObjectMapper om new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);RedisTemplateString, Object template new RedisTemplateString, Object();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashKeySerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer);template.setDefaultSerializer(new StringRedisSerializer());template.afterPropertiesSet();return template;}Beanpublic RedissonClient redissonClient() {Config config new Config();// redis为单机模式config.useSingleServer().setAddress(redis:// host : port);return Redisson.create(config);}
}
眼尖的朋友可能会有疑问我为什么要将RedissonConnectionFactory作为字段依赖注入
其实原代码用的是RedisConnectionFactory同时redisTemplate用的RedisConnectionFactory完成的Bean初始化。我在它的基础上加了个RedissonClient的初始化。
Configuration
public class RedisConfig {Autowiredprivate RedisConnectionFactory factory;Beanpublic RedisTemplateString, Object redisTemplate() {Jackson2JsonRedisSerializerObject jackson2JsonRedisSerializer new Jackson2JsonRedisSerializerObject(Object.class);ObjectMapper om new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);RedisTemplateString, Object template new RedisTemplateString, Object();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashKeySerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer);template.setDefaultSerializer(new StringRedisSerializer());template.afterPropertiesSet();return template;}
}
但其实我这里不管用RedissonConnectionFactory还是RedisConnectionFactory都是一样的最终其实用的都是 RedissonConnectionFactory....
先说答案因为项目中引入了Redisson框架因此Spring容器会优先使用RedissonConnectionFactory因为会优先执行 RedissonAutoConfiguration 文件。
下面是分析过程
我将字段注入去掉并且方法参数改成了RedissonConnectionFactory进行debug 跟进RedissonConnectionFactory继续跟进getConnection方法 发现这里已经变成了redissonConnection
因为项目中使用了Redisson优先初始化RedissonClient【依赖于RedissonConnectionFactory所以RedissonConnectionFactory也初始化了】 看一下为什么RedisConnectionFactory会被替换为RedissonConnectionFactory 跟进RedisConnectionFactory它继承自PersistenceExceptionTranslator 查看PersistenceExceptionTranslator的引用发现同时有RedisConnectionFactory和RedissonConnectionFactory两个Bean 这里使用的是RedissonConnectionFactory。 解决办法
方法1将字段注入去掉这样的话可以打破依赖关系 RedisConfig - RedissonConnectionFactroy
方法2在启动类上添加属性 exclude 将RedisAutoConfiguration 排除掉这样的话也是打破了RedisConfig - RedissonConnectionFactory改成了依赖RedisConnectionFactory