生活小贴士:日常问题排查中的常见 bug 及解决方法

前言

在最近开发中,遇到了几个小问题,在此记录下,以便之后遇到相似问题能快速找到解决办法,节约时间,提高效率。生活小贴士:日常问题排查中的常见 bug 及解决方法

一、雪花Id(snowflake)主键(Long) ,前端丢失精度原理及解决办法

1、案例场景

我们项目之中可能大多数都使用自增长id作为主键id,这样对于中小型系统来说一般没有啥问题。但是随着各种业务发展以及后续可能分库分表情况,我们有些项目或者项目之中的独立微服务可能使用的是雪花算法生成的主键id(19位)长整型的。

最近我们在项目对接其他微服务(使用的雪花主键id)之后,在前端调用接口之后发现返回结果id被裁减了。

数据库主键是1713756638362611713,前端通过分页接口查询的数据传id是1713756638362611700。id没有匹配,导致后续操作失败。

经过试验,在PostMan里面请求接口能够完全正确的返回雪花算法生成的主键id,但是在前端接口请求,浏览器之中就会出现雪花算法精度损失问题。发现这个问题后就找了下解决办法。

2.雪花(snowflake)Id,Long id前端精度损失原因

JavaScript 不支持后台返回的 Long 类型,JavaScript 的 number 类型的数值范围是。

(不包含边界) 所以大于 9007199254740991 的数,进制转换会存在精度问题,而雪花ID生成的数值过大,导致 JavaScript 不能正常存储导致。


3、解决JavaScript Number长整型精度丢失问题

使用Jackson注解,我们也可以用@JsonFormat做类型转换。

在实体类中,id上添加注解:

@JsonFormat(shape = JsonFormat.Shape.STRING)
@JSONField(serializeUsing = ToStringSerializer.class)
/**
  * 事件id
  */
 @JsonFormat(shape = JsonFormat.Shape.STRING)
 @JSONField(serializeUsing = ToStringSerializer.class)
 @TableId(type = IdType.ASSIGN_ID)
 @ApiModelProperty(value = "事件id")
 private Long id;

在浏览器请求接口后,发现id已变成字符串格式了。

生活小贴士:日常问题排查中的常见 bug 及解决方法

二、图片url有中文,获取文件流失败,400 bad request

1.事件起因

给第三方提供接口,让他们推数据过来。数据参数里面有图片url,我这边需要访问图片地址,获取到文件流,然后上传到我们自己的文件服务器上保存,以备后续使用。

在访问图片地址获取流的时候,http请求响应错误信息如下:

生活小贴士:日常问题排查中的常见 bug 及解决方法400 bad request的意思为:错误请求-请求中有语法问题或者不能满足请求。查看了下图片地址,发现图片url内含有中文字符,这可能是导致获取文件流失败的原因。

生活小贴士:日常问题排查中的常见 bug 及解决方法

2.解决方法:使用Url编码把请求参数转义

URLEncode.encode("中文value""utf-8")

三、lombok导致Apache BeanUtils复制类失效

1.事件现象

Lombok(Project Lombok)是一个用于 Java 编程语言的开源库,旨在减少 Java 代码中的冗余和样板代码,提高开发人员的生产力。它通过使用注解来自动生成 Java 类的常见方法和代码,从而使开发人员能够编写更简洁、更具可读性和更易维护的代码。Lombok 的主要目标是简化 Java 开发,减少样板代码,使代码更加精炼,从而提高开发效率。

在我们的实体类或者对象中加入了该注解设置@Accessors(chain=true),这样我们就可以进行链条式调用参数了。生成setter方法返回this(也就是返回的是对象),代替了默认的返回 void。

生活小贴士:日常问题排查中的常见 bug 及解决方法

使用package org.apache.commons.beanutils 复制类。

BeanUtils.copyProperties()复制时无法拷贝。

生活小贴士:日常问题排查中的常见 bug 及解决方法

2.问题分析

由于引入了lombokd的@Accessors(chain=true)注解生成的setter方法,返回的都是this当前对象,而BeanUtils.copyProperties获取的是void返回值类型方法,从而导致拷贝类失效。

生活小贴士:日常问题排查中的常见 bug 及解决方法lombok的@Accessors链式调用会破坏JavaBean的setter规范,从而导致使用java.beans中的PropertyDescriptor(属性描述器)进行反射的时候会获取不到的writeMethodRef的和writeMethodName的内容。

3.解决办法

把@Accessors(chain=true)注解去掉就可以了,不是非必要添加。生活小贴士:日常问题排查中的常见 bug 及解决方法


原文始发于微信公众号(明月予我):生活小贴士:日常问题排查中的常见 bug 及解决方法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/272799.html

(0)
明月予我的头像明月予我bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!