欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

后端将Long类型数据传输到前端出现精度丢失的问题(品优购订单号orderId精度丢失问题)

程序员文章站 2022-07-15 13:46:36
...

1.数据库中的order_id为Long类型的

后端将Long类型数据传输到前端出现精度丢失的问题(品优购订单号orderId精度丢失问题)

(1). TbOrder实体类

@ApiModel(value = "订单表")
@Table(name = "tb_order")
public class TbOrder implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long orderId;
    ....
}

(2). OrderController控制类

@RequestMapping("/order")
@RestController
public class OrderController {
    @Reference
    private OrderService orderService;

    @RequestMapping("/findAll")
    public List<TbOrder> findAll() {
        return orderService.findAll();
    }
}

 

2.前端部分
 

orderController.js

    $scope.findOrderList = function () {
        orderService.findOrderList().success(function (response) {
            $scope.orderList = response;
        })
    }

orderService.js

    this.findOrderList = function () {
        return $http.get("../order/findAll.do");
    }

 

后端将Long类型数据传输到前端出现精度丢失的问题(品优购订单号orderId精度丢失问题)

 

从上面看出来了,后台返回的数据,除了orderId不一致,其他数据都一致,最后在网上百度了一下,因为orderId是Long型的,所以JS在处理返回数据类型是Long的时候,精度会丢失一部分!!!


造成原因:JS内置有32位整数,而number类型的安全整数是53位。如果超过53位,则精度会丢失。正如现在后台传来一个64位的Long型整数,因此超过了53位,所以后台返回的值和前台获取的值会不一样。

解决方法:

后端将Long类型数据传输到前端出现精度丢失的问题(品优购订单号orderId精度丢失问题)
 

ToStringConverter.java
package com.pingyougou.manage.converter;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

public class ToStringConverter extends ObjectMapper {

    public ToStringConverter() {
        super();
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        registerModule(simpleModule);
    }
}

springmvc.xml

    <mvc:annotation-driven >
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg index="0" value="utf-8" />
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                        <value>text/plain;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
            <!--对日期进行转化的-->
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="com.pingyougou.manage.converter.ToStringConverter">
                        <property name="dateFormat">
                            <bean class="java.text.SimpleDateFormat">
                                <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />
                            </bean>
                        </property>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

 

后端将Long类型数据传输到前端出现精度丢失的问题(品优购订单号orderId精度丢失问题)

后端将Long类型数据传输到前端出现精度丢失的问题(品优购订单号orderId精度丢失问题)