场景:
1、项目中**RedisImpl.java中调用HashOperations的delete方法报NoSuchMethodError异常;NoSuchMethodError:org.springframework.data.redis.core.HashOperations.delete(Ljava/lang/object;Ljava/lang/Object)V
2、调用delete方法逻辑类,为单独模块(打包为jar包)
排查过程:
1、查看jar对应spring-data-redis jar包版本(经查为:1.5.2)
2、项目所用spring-data-redis jar版本为:1.8.12
3、经排查项目中其他所有jar没有其他同名java类:HashOperations
4、对比spring-data-redis 1.5.2版本和1.8.12版本中HashOperations及实现类,发现delete 方法的返回值不同(1.5.2为void; 1.8.12为Long)
5、对比spring-data-redis 1.5.2版本和1.8.12版本下**RedisImpl.java java类对应的class文件,class内容中为delete方法指定了返回值,因此在1.8.12下找不到void delete方法而报错。
解决方案:
方案一:模块中升级spring-data-redis 1.5.2版本至1.8.12版本,重新打包jar包;
方案二:项目降级spring-data-redis 至1.5.2版本(需分析风险和兼容性)
结论:
1、需注意项目编译和运行时引用jar包版本是否一致,尤其需留意方法声明有变更的情况(包含返回值)
2、观察问题内容不够细致,异常信息已经打印了delete方法的返回值,应该第一时间去核对方法声明;NoSuchMethodError:org.springframework.data.redis.core.HashOperations.delete(Ljava/lang/object;Ljava/lang/Object)V