项目依赖版本升级时方法的返回值类型从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 引用新包。
总结:
接口升级是有风险的,必须考虑兼容。
总体表现就是,项目依赖版本升级时,将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 引用新包。
总结:
接口升级是有风险的,必须考虑兼容。
相关文章推荐
- 对于返回void类型的asyc的异步方法,如何修改,能使用await
- 创建maven项目后,修改jre版本alt+f5后,返回默认1.5版本解决方法
- 主从复制在丛库修改字段类型导致复制异常及解决方法
- 因修改/etc/ssh权限导致的ssh不能连接异常解决方法
- 修改android项目sdk版本的方法
- Unity3D项目返回低版本方法
- 升级CUDA版本导致VS2010错误:未找到导入的项目XXX,请确认<Import>声明中的路径正确,且磁盘上存在该文件。。。。
- eclipse下修改项目名导致tomcat内发布名不一致的解决方法
- eclipse下修改项目名导致tomcat内发布名不一致的解决方法
- eclipse下修改项目名导致tomcat内发布名不一致的解决方法
- @RequestMapping方法返回值为String类型
- C++ 再谈string类型(2) 修改string对象的方法
- 关于.NET MVC4 Action 方法返回JsonResult和返回String类型的区别
- 因为此版本的应用程序不支持其项目类型(.vcproj)的解决方法
- eclipse下修改项目名导致tomcat内发布名不一致的解决方法
- 升级CUDA版本导致VS2010错误:未找到导入的项目XXX,请确认<Import>声明中的路径正确,且磁盘上存在该文件
- 关于jdk版本问题导致的eclipse导入web项目出错解决方法
- Android升级ADT和SDK版本运行项目 报出java.lang.VerifyError 异常解决办法
- xcode 4 最低的要求是 10.6.6的版本,如果你是 10.6.3的版本,又不想升级的话。可以考虑通过修改版本号的方法进行安装
- 升级CUDA版本导致VS2010错误:未找到导入的项目XXX,请确认<Import>声明中的路径正确,且磁盘上存在该文件。。。。