SpringBoot与Vue前后分离项目中返回结果为Long类型精度丢失问题处理

news2024/11/15 3:44:26

SpringBoot与Vue前后分离项目中返回结果为Long类型精度丢失问题处理

文章目录

  • SpringBoot与Vue前后分离项目中返回结果为Long类型精度丢失问题处理
  • 1. 前后分离环境
    • 1. 表结构
    • 2. 实体类
  • 2. 问题描述
  • 3. 原因分析
  • 4. 处理方法(后端)
    • 1. 处理方式1(@JsonSerialize注解)
    • 2. 处理方式2(@JsonFormat注解)
    • 3. 处理方式3推荐(全局解决)
  • 5. 处理方法(前端)
    • 1. 安装 json-bigint
    • 2. Axios处理
  • 6. 处理后输出结果如下

1. 前后分离环境

后端: SpringBoot + Mybatis-plus

前端: vue + elemnet-ui

数据库:Oracle12c

1. 表结构

create table TB_CONFIG
(
    ID     NUMBER(20) not null primary key,
    MODULE_NAME VARCHAR2(100),
    CONFIG      CLOB,
    NOTE        VARCHAR2(200),
    CREATED_BY  NUMBER(20),
    CREATE_TIME DATE        default SYSDATE  
)

2. 实体类

package com.yuan.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;


@Getter
@Setter
@TableName("TB_CONFIG")
@ApiModel(value = "Config对象", description = "配置表")
public class Config implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "ID")
    @TableId
    private Long id;

    @ApiModelProperty(value = "模块")
    private String moduleName;

    @ApiModelProperty(value = "配置项")
    private String config;

    @ApiModelProperty(value = "备注")
    private String note;

    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;
}

2. 问题描述

数据库中存储的是Nubmer(20)类型的数据,前端接收后精度丢失

  1. 数据库记录

在这里插入图片描述

  1. 前端接收到的结果如下,最后两位会变成00
[
  {
    "id": 1779709862042493000,
    "moduleName": "顶顶顶顶",
    "config": null,
    "note": null,
    "createTime": "2024-04-15T11:19:59",
  },
  {
    "id": 1779709995329085400,
    "moduleName": "222",
    "config": null,
    "note": null,
    "createTime": "2024-04-15T11:19:59",
  },
  {
    "id": 1779711237837119500,
    "moduleName": "3",
    "config": null,
    "note": null,
    "createTime": "2024-04-15T11:19:59",
  },
  {
  "id": 1778942074839457800,
  "moduleName": "jinshengyuan",
  "config": null,
  "note": "备注",
  "createTime": "2024-04-13T08:23:36",
 }
]

3. 原因分析

MyBatis-Plus中使用 ASSIGN_ID(默认雪花算法) 生成的id作为主键时(或使用其他工具,如hutool生成雪花算法的ID值时),因为其长度为19位,而前端一般能处理16位,所以结果返回给前端会造成精度丢失,最后两位会变成00,有点类似四舍五入的效果

4. 处理方法(后端)

Spring Boot默认使用的是jackson对响应的JSON数据进行序列化的,后端处理方式就是返回结果给前端时,将Long类型转换为字符串即可解决,如果改变了默认的序列化框架jackson为其他框架,则需要按照对应框架的相关规则来处理,如fastjson等。下面以jackson序列化为例。

  • 局部解决: 通过在字段上标注@JsonSerialize@JsonFormat注解来解决
  • 全局解决:通过配置类,全局转换

1. 处理方式1(@JsonSerialize注解)

给需要转换的Long类型字段上面标注 @JsonSerialize(using = ToStringSerializer.class)来解决,如下

//......

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
//......
public class Config implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonSerialize(using = ToStringSerializer.class)//Long类型转String,解决前端精度丢失问题
    @ApiModelProperty(value = "ID")
    @TableId
    private Long id;

    //......
}

2. 处理方式2(@JsonFormat注解)

给需要转换的Long类型字段上面标注 @JsonSerialize(using = ToStringSerializer.class)来解决,如下

//......
import com.fasterxml.jackson.annotation.JsonFormat;
//......
public class Config implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonFormat(shape = JsonFormat.Shape.STRING)//Long类型转String,解决前端精度丢失问题
    @ApiModelProperty(value = "ID")
    @TableId
    private Long id;

    //......
}

3. 处理方式3推荐(全局解决)

新增一个配置类,然后配置需要转换序列化的类型即可,如下

package com.yuan.config;

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.math.BigInteger;

/**
 * <p>
 *
 * @Description: 解决数据库主键存储为雪花算法生成的ID值后,返回给前端时精度丢失的问题 <br>
 * </p>
 * @Datetime: 2024/4/14 16:33
 * @Author: Yuan · JinSheng <br>
 * @Since 2024/4/14 16:33
 */
@Configuration
public class Jackson2ObjectConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer customizer() {
        return builder -> {
            builder.serializerByType(Long.class, ToStringSerializer.instance);
            builder.serializerByType(BigInteger.class, ToStringSerializer.instance);
            //其他类型转换可以按需在这里添加......
        };
    }
}

5. 处理方法(前端)

前端可借助json-bigint插件来解决,一般请求都使用的Axios库,所以可以通过axios.defaults.transformResponse结合jsono-bigint来解决

1. 安装 json-bigint

pnpm add json-bigint
# 或
yarn add json-bigint

2. Axios处理

//......
import JSONBIG from 'json-bigint'
//......
axios.defaults.transformResponse = [
  function (data) {
    const jsonBig = JSONBIG({
      storeAsString: true
    })
    return jsonBig.parse(data)
  }
]
//......

6. 处理后输出结果如下

可看到id已经被转换为字符串了

[
    {
        "id": "1779709862042492928",
        "moduleName": "顶顶顶顶",
        "config": null,
        "note": null,
        "createTime": "2024-04-15T11:14:31"
    },
    {
        "id": "1779709995329085440",
        "moduleName": "222",
        "config": null,
        "note": null,
        "createTime": "2024-04-15T11:15:02"
    },
    {
        "id": "1779711237837119488",
        "moduleName": "3",
        "config": null,
        "note": null,      
        "createTime": "2024-04-15T11:19:59"
    },
    {
        "id": "1778942074839457792",
        "moduleName": "jinshengyuan",
        "config": "{}",
        "note": "备注",
        "createTime": "2024-04-13T08:23:36"
    }
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1596597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【InternLM 实战营第二期笔记01】书生·浦语大模型全链路开源体系+InternLM2技术报告

本次课程链接在GitHub上&#xff1a;InternLM/Tutorial at camp2 (github.com) 第一次课程录播链接&#xff1a;书生浦语大模型全链路开源体系_哔哩哔哩_bilibili InternLM2技术报告&#xff1a;arxiv.org/pdf/2403.17297.pdf 一、书生浦语大模型全链路开源体系笔记 Intern…

STM32H7的MPU学习和应用示例

STM32H7的MPU学习记录 什么是MPU&#xff1f;MPU的三种内存类型内存映射MPU保护区域以及优先级 MPU的寄存器XN位AP位TEX、C、B、S位SRD 位SIZE 位CTRL 寄存器的各个位 示例总结 什么是MPU&#xff1f; MPU&#xff08;Memory Protection Unit&#xff0c;内存保护单元&#xf…

docker安装并跑通跑通QQ机器人实践(1)-前言及展示

随着大模型技术的迅猛发展&#xff0c;行业应用日益丰富且专业化。为了有效利用大模型的强大功能&#xff0c;建立与之紧密互动的应用接口至关重要。在此背景下&#xff0c;QQ、微信、钉钉等主流即时通讯工具凭借其广泛的用户覆盖和便捷的通信特性&#xff0c;成为连接用户与大…

动画渲染多少钱一秒?云渲染一分钟动画费用

动画渲染的费用因其复杂度和技术要求而异&#xff0c;云渲染服务则提供了一种高效的解决方案。一般而言&#xff0c;渲染一分钟动画的费用可能从几百到几千元不等&#xff0c;具体取决于使用的资源和渲染质量。下面来看看相关费用吧。 动画渲染多少钱一秒? 参考&#xff1a;…

更改android 安装的sdk版本

打开sdk manager 勾选show details 就可以选择了。

找不到msvcr120.dll要怎么解决?一键修复msvcr120.dll的详细解决方法

操作Windows系统的用户有时会遇到一个错误提示&#xff0c;显示“找不到msvcr120.dll”&#xff0c;通常被描述为“msvcr120.dll文件丢失”。解决这一问题其实有多种方式&#xff0c;且操作起来相对简单。以下是解决"msvcr120.dll丢失"问题的详细方法。 一.msvcr120…

每日一VUE——组件的生命周期

文章目录 VUE组件的生命周期生命周期钩子函数实例创建Teleport VUE组件的生命周期 组件生命周期 组件从创建到挂载、更新、到销毁的一系列过程被称为组件的生命周期。 生命周期函数 在组件的各个生命周期节点执行的函数&#xff0c;为生命周期钩子函数。 生命周期钩子函数…

最新版IntelliJ IDEA 2024.1安装和配置教程 详细图文解说版安装教程

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版 文章目录 IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版前言 第一步&#xff1a; IntelliJ IDEA 2024.1安装教程第 0 步&…

一款功能齐全的iOS混淆工具介绍及功能详解

机缘巧合偶遇iOS马甲包业务&#xff0c;前期也使用过目前市面上其他得工具&#xff0c;实际效果不太理想。经过大量实践&#xff0c;开发出一款功能齐全的混淆工具。工具的主要功能OC、C、Swift已封装成Mac应用&#xff0c;其他功能还在封装中&#xff0c;敬请期待。 马甲包的本…

网站添加PWA支持,仅需三步,无视框架的类型

总结起来&#xff0c;网站配置PWA简单步骤为&#xff1a; 编写 manifest.json&#xff1b;编写 serviceWorker.js&#xff1b;在 index.html 引入上述两个文件&#xff1b;把上述三个文件放在网站根目录(或者同一目录下)&#xff1b;网站需要部署在https环境才能触发&#xff…

[C++][算法基础]求最小生成树(Kruskal)

给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出 impossible。 给定一张边带权的无向图 G(V,E)&#xff0c;其中 V 表示图中点的集合&#xff0c;E 表示图…

JavaScript代码获取浏览器的可视高、文档滚动高和滚动距离

获取浏览器可视高度 var clientHeight 0; if (document.body.clientHeight && document.documentElement.clientHeight) {// 如果同时存在 document.body.clientHeight 和 document.documentElement.clientHeightclientHeight Math.min(document.body.clientHeight,…

【wu-framework-parent】官网介绍

官网地址 介绍 springboot 版本3.2.1 wu-framework-parent 是一款由Java语言开发的框架&#xff0c;目标不写代码但是却能完成功能。 框架涵盖无赖ORM( wu-framework-lazy-orm-spring-starter)、仿生组件 、easy框架系列【Easy-Excel、easy-listener、easy-upsert】 授权框架…

Postgresql源码(125)游标恢复执行的原理分析

问题 为什么每次fetch游标能从上一次的位置继续&#xff1f;后面用一个简单用例分析原理。 【速查】 恢复扫描需要知道当前页面、上一次扫描到的偏移位置、当前页面一共有几条&#xff1a; 当前页面&#xff1a;HeapScanDesc结构中记录了扫到的页面&#xff08;scan->rs_cb…

如何安装Windows版VRTE2.1.0开发环境并进行开发

前言&#xff08;Abstract&#xff09; 本文档记录了如何安装Windows版VRTE2.1.0开发环境并进行开发&#xff0c;并且总结了当部署在安装了比较陈旧版本Linux内核&#xff08;如<4.5&#xff09;和库的板子上所遭遇的困难&#xff0c;如S32V234EVB。 Definitions and Abbre…

自动化测试selenium(2)

目录 WebDriver介绍 WebDriver使用 使用WebDriver驱动操作浏览器(打开一个百度) WebDriver 相关API 定位元素 操作元素 上一篇主要介绍了自动化测试的概念以及selenium的基本原理, 这里我们来讲一下如何利用selenium来写测试用的脚本. WebDriver介绍 Selenium是一个用于…

Zookeeper(从入门到掌握)看完这一篇就够了

文章目录 一、初识 Zookeeper1.Zookeeper 概念2.Zookeeper 数据模型3.Zookeeper 服务端常用命令4.Zookeeper 客户端常用命令 二、ZooKeeper JavaAPI 操作1.Curator 介绍1.Curator API 常用操作&#xff08;1&#xff09;建立连接&#xff08;2&#xff09;添加节点&#xff08;…

对链表的进一步认识

********以下内容均是个人理解&#xff0c;个人语言&#xff0c;仅代表个人观点&#xff0c;希望能对你有所帮助*************** 1.对链表的进一步深入理解分析 &#xff08;1&#xff09;逻辑结构&#xff1a;想象出来的&#xff0c;并不是真实存在的&#xff0c;例如里面的…

idm线程越多越好吗 idm线程数多少合适

IDM&#xff08;Internet Download Manager&#xff09;是一款流行的下载管理软件&#xff0c;它支持多线程下载&#xff0c;这意味着它可以同时建立多个连接来下载文件的不同部分&#xff0c;从而提高下载速度。我们在使用IDM的时候总是有很多疑问&#xff0c;今天我们学习IDM…

HIT The Wiorld,HIT世界官网地址+配置要求+测试时间+加速器分享

HIT The Wiorld&#xff0c;HIT世界官网地址配置要求测试时间加速器分享 NEXON新游《HIT&#xff1a;世界&#xff08;HIT&#xff1a;The World&#xff09;》将在4月17日上线&#xff0c;目前已在官网开启事前预约预创建角色。Hit :the world&#xff08;HIT:世界&#xff…