记开发时遇到的两个问题以及解决方案

来源:互联网 发布:linux主机 编辑:程序博客网 时间:2024/06/06 01:35

记开发时遇到的两个问题以及解决方案

  今天说两个平时工作中遇到的两个小问题,以及解决方案,ps:当时还是花了不少时间找原因的,现在记录下来,没事的时候自己翻翻,如果能帮助到小伙伴那就更好了!

问题一(字节编码):

出现场景:

  1. 在单元测试spring的service是否能够使用时,出现以下问题

问题描述:

FactoryBean threw exception on object creation; nested exception is java.lang.RuntimeException: java.io.IOException: invalid constant type: 15

产生原因:

  1. 本机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/

小结

  实际开发过程中遇到很多莫名奇妙的问题,归根结底还是对使用的数据类型的不够了解导致。


这里写图片描述

扫码关注,一起进步

个人博客: http://www.andyqian.com

阅读全文
0 0