您的位置:首页 > 其它

项目依赖版本升级时方法的返回值类型从void修改为String导致的异常

2017-04-24 00:00 405 查看
公司同事在开发过程中遇到的一个问题,感觉很有趣,所以分享一下:

总体表现就是,项目依赖版本升级时,将redis的setnx()方法的返回值类型从void修改为String,结果导致的异常产生。

reids升级版本异常排查:

[java.lang.NoSuchMethodError:com.helijia.framework.redis.RedisService.setnx(Ljava/lang/String;Ljava/lang/String;)V]

问题分析:

1.在开发过程中,遇到这样一个问题,redis 方法setnx()真正的返回类型为Long,而经过公司内部封装之后返回类型为void ,而我们需要真正的返回类型为Long。为此,我们把 redisService.setnx()返回类型修改为Long,打包成redis.1.2.5上线。

2.其他二方库,例如 promotion.admin(促销管理后台和活动报名使用)引用的是老版本的redis1.2.2。将手艺人id作为key值,city作为value缓存起来。代码:



而此时,redisService.setnx() 是依赖 1.2.2编译的。编译好的jar,文件都是.class。虚拟机的实现采用延迟装载类的策略,直到类真正地被程序使用时才装载。所以启动不会报错,在真正是使用时采取加载。在使用 loadArtisanCity()时,jvm检查器检查.calss文件时,setnx()没有匹配的返回类型就会报出异常。

3.app-merchant 引入了promotion.admin和amoeba.mentor 二方库。pom.xml 引用的redis版本为1.2.5,此时线上会报出异常。[java.lang.NoSuchMethodError: com.helijia.framework.redis.RedisService.setnx(Ljava/lang/String;Ljava/lang/String;)V]

自从项目,上线以来,线上没有发现该异常,是因为,活动报名手艺人都是get()数据,没有setex()数据。造成问题没有暴露出来。

解决方法:

setnx()不能直接修改返回类型,应该新建一个方法setnxV2()或新建一个service。通过还原代码,并加入新代码,打包上线。app-merchant 引用新包。

总结:

接口升级是有风险的,必须考虑兼容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐