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

本文记录了在Spring开发中遇到的两个问题:字节编码问题,由于Java版本不兼容导致的错误;以及JavaScript Number精度问题,导致数据丢失。解决方案包括调整JDK版本、排除Dubbo的特定依赖并添加新的javassist依赖,以及将Long类型数据转换为String返回以防止精度丢失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  今天说两个平时工作中遇到的两个小问题,以及解决方案,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值