Springboot-Vue-MybatisPlus 返回给前端的 Long类型数据失去精度怎么办 之 Long类型作为实体类的一个属性

Springboot-Vue-MybatisPlus 返回给前端的 Long类型数据失去精度怎么办?

在将自己的Mybatis的系统转换为Mybatis-Plus的时候,遇到了许多问题。

今天的问题是,Java实体类中的字段属性是Long类型、数据库MySql中的是bigint,在前端显示的时候Long的进度却丢失了,所有的ID显示的都一样,这该怎么解决呢?

实体类:

package com.neu.edu.cloudfactoryplus.bean;


import com.baomidou.mybatisplus.annotation.*;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;

/**
 * <p>
 *
 * </p>
 *
 * @author duzhenyang
 * @since 2021-08-17
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("factory_manager")
public class FactoryManager implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "fm_id", type = IdType.ID_WORKER)
    private Long fm_id;

    private String fm_name;

    private String fm_password;

    private String fm_realName;

    private String fm_contact;

    @JsonSerialize(using = ToStringSerializer.class)
    private Long fm_factoryID;

    /**
     * 乐观锁
     */
    @Version
    private Integer version;

    /**
     * 逻辑删除
     */
    @TableLogic
    private Integer deleted;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private Date gmt_create;

    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date gmt_modified;


}

数据库设计

在这里插入图片描述

错误结果:

在这里插入图片描述

如图所示,Long类型精度已经丢失!!!

解决办法:

1)如果你采用的是 Spring 中的 Jackson 进行 Json 格式封装,那么要这么做

用到了JsonFormat注解让对象属性在经过spring解析成JSON时直接转化成字符串,在要转的字段上加上一下字段:
	/**
	 * 用户ID
	 */
	@TableId(value = "user_id", type = IdType.INPUT)
	@JsonFormat(shape = JsonFormat.Shape.STRING)//转化成string传到前端
	private Long userId;

或者写一个配置类进行全局拦截,将所有的 Long 类型(注意这里是 Long 包装类,不是 long 类型!!!)转换为 String 类型:
@Configuration
public class JacksonConfig {
    /**
     * Jackson全局转化long类型为String,解决jackson序列化时传入前端Long类型缺失精度问题
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        Jackson2ObjectMapperBuilderCustomizer cunstomizer = new Jackson2ObjectMapperBuilderCustomizer() {
            @Override
            public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
//				jacksonObjectMapperBuilder.serializerByType(BigInteger.class, ToStringSerializer.instance);
                jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);
//                jacksonObjectMapperBuilder.serializerByType(Long.TYPE, ToStringSerializer.instance);
            }
        };
        return cunstomizer;
    }
}

2)如果你和我一样采用的是 alibaba 的 fastjson 进行 Json 格式封装,那么要这么做

在Long类型的字段上面加上注解,在转换为json的时候,讲此字段转为String类型(特别注意:加上注解导入类的时候,一定要仔细看清,导入alibaba的类,因为IDEA默认好像导入jackson的类,要不然会报错的!!!)
@JSONField(serializeUsing = ToStringSerializer.class)   //导入的注解
    private Long fm_factoryID;
注意这些导入的类的名字!!!!
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.ToStringSerializer;

解决后的结果

在这里插入图片描述

看到这里了,不点个赞再走(o _ o)
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值