如何解决前端传递数据给后端时精度丢失问题

这篇具有很好参考价值的文章主要介绍了如何解决前端传递数据给后端时精度丢失问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

解决精度丢失

有时候我们在进行修改操作时,发现修改既不报错也不生效。我们进行排查后发现服务器端将数据返回给前端时没有出错,但是前端js将数据进行处理时却出错了,因为id是Long类型的,而js在处理后端返回给前端的Long类型数据时只能处理前16位,后3位进行了四舍五入操作,例如后3位为225->200,所以前端的数据就出错了,在修改后发起请求时携带的数据就是错误的,所以修改并不生效。
如何解决前端传递数据给后端时精度丢失问题,SpringBoot,异常合辑,java,spring boot

解决方法

服务器给页面响应json数据时进行处理,将long类型的数据统一为String类型文章来源地址https://www.toymoban.com/news/detail-698594.html

解决步骤

对象转换器

  • 提供对象转换器JacksonObjectMapper,基于Jackson进行Java对象到json数据的相互转换,同时将long类型转为String类型。addSerializer(Long.class, ToStringSerializer.instance)
package com.ldh.reggie.common;


/**
 * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
 * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
 */
public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);


        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))

                .addSerializer(BigInteger.class, ToStringSerializer.instance)
          //将Long类型的数据转为String类型
                .addSerializer(Long.class, ToStringSerializer.instance)
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}

消息转换器

  • 在WebMvcConfig配置类中扩展Spring mvc的消息转换器,在此消息转换器中使用提供的对象转换器进行Java对象到json数据的转换,其中特别的是会将long类型数据转为String类型。不扩展配置则默认使用Spring mvc的消息转换器,它也会将Java对象与Json类型之间进行相互转换,这就是为什么我们在CRUD操作中返回return R.success(pageInfo),前端页面获取到的是JSON类型的数据。
package com.ldh.reggie.config;

@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

    //扩展mvc框架的消息转换器
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        //创建消息转换器对象
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        //设置对象转换器,底层使用Jackson将Java对象转为json
        messageConverter.setObjectMapper(new JacksonObjectMapper());
        //将上面的消息转换器对象追加到mvc框架的转换器集合中,index为转换器在集合中的顺序,最先才能生效
        converters.add(0,messageConverter);
    }
}

到了这里,关于如何解决前端传递数据给后端时精度丢失问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Layui table的动态表格lay-data怎么传递参数给后端

    Layui table的动态表格lay-data怎么传递参数给后端 前端代码: js代码: 注意上面代码注释内容即可。

    2024年02月12日
    浏览(44)
  • formData手动上传问题前端如何传递后端如何接收

    参考文章: 解决Current request is not a multipart request axios上传文件错误:Current request is not a multipart reques 之前使用el-upload使用默认action表单提交.前端默认content-type为multipart/form-data.没有问题. 后期渐进式优化.修改为axios+formdata传递内容. Current request is not a multipart request 这个错误是因

    2024年02月03日
    浏览(46)
  • 后端long类型数据在前端产生精度损失

    后端我们常常会用Long类型的数据作为ID,例如用雪花算法生成唯一ID java中long类型的取值范围 (-9,223,372,036,854,775,808)(9,223,372,036,854,775,807)。有19位数字 JavaScript的Number类型是浮点数类型,它可以表示的整数范围是从(-9,007,199,254,740,992)到2^53(9,007,199,254,740,992)只有16位数

    2024年02月16日
    浏览(49)
  • 后端传long类型数据到前端精度丢失问题

    在 Spring Boot 中,将 long 类型传输到前端时,会发现该类型的值可能会出现精度丢失的问题。 这是因为在 JavaScript 中,数字类型默认会被转换为双精度浮点数,而双精度浮点数的精度有限,只能精确表示 2 的 53 次方以内(即 Number.MAX_SAFE_INTEGER,约为 9 x 10^15)的整数。对于超过

    2024年02月15日
    浏览(48)
  • 前端接收后端数据时,遇到精度丢失的问题

    之前项目开发过程中遇到过前端接收后端数据时,遇到精度丢失的问题。当时进行了问题记录,本篇博客针对于这个问题进行问题原因并进行多种方式解决这个问题。 前端接收后端返回的数据时出现精度丢失问题,通常是因为在数据传输过程中,数据类型被转换为了 JavaScr

    2024年02月02日
    浏览(69)
  • 前端Get Post Put Delect请求 传参数 不传参数给后端

    Get请求不传参、Get请求传不是实体类的参数、Get请求传实体类的参数 Post 请求不传参数、Post请求传不是实体类的参数、Post请求传实体类的参数  总是分不清,其中Delect 请求使用的地方很少就先记录Delete请求吧 前端 前端跳后端 后端 前端 前端跳后端 后端 前端 前端跳后端 后

    2024年02月07日
    浏览(65)
  • SpringBoot后端Long数据传到前端js精度损失问题

    在对应的字段上添加注解,将 Long 转为 String 后传输。 在 js 对应的结果接收上使用 BigInt 。

    2024年02月19日
    浏览(56)
  • 前端传递JSON数组数据到后端(解析方法)

            在前端和后端之间 传递数组 时,由于HTTP协议的限制,无法直接传递数组类型的参数。 请求参数需要被转换为字符串格式传递给后端,所以需要通过 JSON.stringify() 方法将 gradeIdArray 数组转换为一个 JSON 字符串,并将其作为参数传递给后端。         在后端的控

    2024年02月16日
    浏览(54)
  • @RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)

    目录 一、@RequestMapping  路由映射 二、参数传递 1、传递单个参数 2、传递多个参数 3、传递对象 4、后端参数重命名 5、传递数组 6、传递集合 7、传递JSON 8、获取url中的参数 9、上传图片/文件 指定请求访问的路径 既可以修饰类,又可以修饰方法 @RequestMapping支持Get、Post、Dele

    2024年02月04日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包