记开发时遇到的两个问题以及解决方案
今天说两个平时工作中遇到的两个小问题,以及解决方案,ps:当时还是花了不少时间找原因的,现在记录下来,没事的时候自己翻翻,如果能帮助到小伙伴那就更好了!
问题一(字节编码):
出现场景:
- 在单元测试spring的service是否能够使用时,出现以下问题
问题描述:
FactoryBean threw exception on object creation; nested exception is java.lang.RuntimeException: java.io.IOException: invalid constant type: 15
产生原因:
- 本机jdk版本为: 1.8.0_112,项目中使用jdk版本是: 1.7.0, 2.经查找,2.8.4的dubbo版本中的包含了javassist-3.15.0-GA版本,而该版本不兼容jdk1.8导致。
解决办法:
方法一: 设置运行该项目的版本为1.7.x版本即可。
方法二:
步骤一: 在maven中将dubbo中的版本排除掉:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<exclusions>
<exclusion>
<artifactId>org.javassist</artifactId>
<groupId>javassist</groupId>
</exclusion>
</exclusions>
</dependency>
步骤二: 添加org.javassist: 3.18.0-GA及以上的依赖即可使用:
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.0-GA</version>
</dependency>
如果版本为:3.17.0-GA 则会错误信息:
FactoryBean threw exception on object creation; nested exception is java.lang.RuntimeException: Inconsistent args count operand in invokeinterface
问题二(js Number精度问题)
出现场景:
在写Rest接口提供给移动网页端使用时,出现由于数据精度问题,导致数据丢失的现象。当时返回的结果是这样的:
(格式化前):
{
"respObj": {
"oid": 362900267898773544
},
"errorCode": null,
"success": true
}
其中oid在Java中对应的为Long类型,返回给前端时候格式化后,返回的结果为: (格式化后):
{
"respObj": {
"oid": 362900267898773570
},
"errorCode": null,
"success": true
}
注意此时的oid已经发生了变化,从格式化前的: 362900267898773544, 格式化后成为了: 362900267898773570, 由于精度丢失,也就出现了问题,(用户A的oid由于精度丢失,oid发生变化,回传给服务端会查询用户B的资料,或者查询不到任何信息。)
产生原因
首先我们需要看下JSON的数据类型,如下图所示:
类型 | 描述 |
---|---|
数字型(Number) | JavaScript 中的双精度浮点型格式 |
字符串型(String) | 双引号包裹的 Unicode 字符和反斜杠转义字符 |
布尔型(Boolean) | true 或 false |
数组(Array) | 有序的值序列 |
值(Value) | 可以是字符串,数字,true 或 false,null 等等 |
对象(Object) | 无序的键:值对集合 |
空格(Whitespace) | 可用于任意符号对之间 |
null | 空 |
这里需要注意的是,此时Number的类型其实对应的就是Javascript中Number类型,查询后得知,Javascript中的Number的安全整数范围为: ( -(2^53 - 1) 至 2^53 - 1). 而在Java中Long类型的安全范围是: ( -(2^63 - 1) 至 2^63 - 1之间)。
因而在上述的oid中超过2^53-1时则会丢失精度。
注意: 服务端返回时不会丢失精度,只有将服务端JSON字符串格式化时,才会丢失精度. (Chrome浏览器中的preview窗口也是格式化后的)
解决方法
服务端将Long类型的统一转换成String返回即可,如上例返回结果为:
{
"respObj": {
"oid": "362900267898773570"
},
"errorCode": null,
"success": true
}
参考链接:
https://jboss-javassist.github.io/javassist/
小结
实际开发过程中遇到很多莫名奇妙的问题,归根结底还是对使用的数据类型的不够了解导致。