关于使用雪花ID后端到前台精度丢失的问题?

来源:6-10 增加删除电子书功能

布辛

2021-03-04

问题流程:

  1. 点击新增按钮,新增电子书;
  2. 点击刚刚新增行的删除按钮,无法删除;

分析:

  1. 调试后台发现数据库中确实生成了,而且也返回到了前端,id=22660681123893248
15.990 DEBUG c.m.w.m.E.selectByExample     :137  http-nio-8880-exec-5 ==>  Preparing: select id, `name`, category1_id, category2_id, description, cover, doc_count, view_count, vote_count from ebook LIMIT ?, ?
15.990 DEBUG c.m.w.m.E.selectByExample     :137  http-nio-8880-exec-5 ==> Parameters: 4(Integer), 4(Integer)
15.990 TRACE c.m.w.m.E.selectByExample     :143  http-nio-8880-exec-5 <==    Columns: id, name, category1_id, category2_id, description, cover, doc_count, view_count, vote_count
15.991 TRACE c.m.w.m.E.selectByExample     :143  http-nio-8880-exec-5 <==        Row: 5, Oracle 入门教程, null, null, 零基础入门 Oracle 开发,企业级应用开发最佳首选框架, /image/cover2.png, null, null, null
15.991 TRACE c.m.w.m.E.selectByExample     :143  http-nio-8880-exec-5 <==        Row: 22660681123893248, 1, 1, 1, 1, null, null, null, null
15.991 DEBUG c.m.w.m.E.selectByExample     :137  http-nio-8880-exec-5 <==      Total: 2
  1. 但返回到前端,ID的值就变了, id=22660681123893250
list: Array(2)
0: {id: 5, name: "Oracle 入门教程", category1Id: null, category2Id: null, description: "零基础入门 Oracle 开发,企业级应用开发最佳首选框架", …}
1: {id: 22660681123893250, name: "1", category1Id: 1, category2Id: 1, description: "1", …}

总结:
老师,这个是由于精度的问题么,有的时候就会这样,有的时候就能正常删除,怎么解决呢?

写回答

3回答

布辛

提问者

2021-03-04

老师,我暂时解决了,但不知道您是否有更好的解决方法?

第一种,添加JacksonConfig全局配置

@Configuration
public class JacksonConfig {

    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder)
    {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();

        // 全局配置序列化返回 JSON 处理
        SimpleModule simpleModule = new SimpleModule();
        //JSON Long ==> String
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        return objectMapper;
    }

}

第二种,修改EbookQueryResp中的getId返回类型

private Long id;

....

public String getId() {
    return id.toString();
}

public void setId(Long id) {
    this.id = id;
}


对比下:

第一种,全局统一配置;

第二种,比较简单,直接修改,但每个类都需要手动修改get方法,后者把ID单独提取到基类中,让所有的Resp都继承基类的get方法。

3
1
甲蛙
这个得给你点赞,推荐第一种做法,准备后续在我公众号单独出个视频讲解下
2021-03-05
共1条回复

慕妹9162326

2021-04-03

long convert to String jiu xing le

0
0

39sakuchan

2021-03-17

我也是这个问题

0
3
甲蛙
回复
bbbbbbbbbbbb
这是因为分页属性里的total也是个long类型,也会被转成string,可以在前端用Number(total)把它转成number类型
2021-04-05
共3条回复

Spring Boot+Vue3前后端分离,实战wiki知识库系统

一课掌握前后端最火框架,更有职场竞争力

2524 学习 · 1671 问题

查看课程