Java中Long类型传入前端数值出错问题

 更新时间:2024年04月24日 11:54:35   作者:苏染3  
这篇文章主要介绍了Java中Long类型传入前端数值出错问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.问题描述

做数据资产交易项目发现,在列表点击详情时,没有得到对应的详情页面,从后端请求数据部分都为空

通过查看网络请求看到,请求的data值时null,而不是对应的详情数据,

查看请求,发现请求对应的id并不是产品的id,最后几位数值出现错误,之后在数据列表的响应中发现,数据的id也都是错误的,都是在第16位或者第17位进行了四舍五入,后续数字都为0。

之后找到的问题的根源,在mysql数据库中,Java中的Long类型对应其中的bigInt类型,支持20位,而前端接收Long类型的数值(超过16位)时,会对第16位进行四舍五入,17位及之后补0,因此造成数值出错。

2.解决办法

在通过查找后,找到了对应的解决办法,均为将后端的返回值中的id转化位String类型,下列为具体解决办法。

2.1 修改id的类型为String

这种方法并不是很好,因为id的Long类型,对应数据库中的bigInt类型,数据库中一般都使用bigInt来表示id,因此这样修改会导致之后会有很多地方需要修改,因此并不推荐

2.2 在id进行序列化时,以String形式序列化

这种方法并没有上述方法的问题

2.2.1 使用StringBoot的Jackson依赖中包

  • 单个数据

此处使用的为Jackson下的ToStringSerializer

    @JsonSerialize(using = ToStringSerializer.class)
    private Long productId;
  • 针对所有的Long类型数据(将所有的Long类型的数据改变的序列化方式)

通过添加配置类来解决这个问题

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
 
@Configuration
public class JacksonConfig {
     @Bean
     @Primary
     @ConditionalOnMissingBean(ObjectMapper.class)
     public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
         ObjectMapper objectMapper = builder.createXmlMapper(false).build();
         SimpleModule simpleModule = new SimpleModule();
         //Long类型----String
         simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
         objectMapper.registerModule(simpleModule);
         return objectMapper;
    }
}

2.2.2 使用FastJson

  • 单个数据

此处使用的为FastJSON下的ToStringSerializer

    @JSONField(serializeUsing = ToStringSerializer.class)
    private Long productId;
  • 多个数据

通过重写WebMvcConfigurer中的configureMessageConverters方法重新配置转换器

import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class CustomFastJsonConfig {
    @Bean
    FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        //1.定义convert转换消息的对象
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        //2.添加fastJson的配置信息
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        //3.设置Long为字符串
        SerializeConfig serializeConfig = SerializeConfig.globalInstance;
        serializeConfig.put(Long.class, ToStringSerializer.instance);
        serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
        fastJsonConfig.setSerializeConfig(serializeConfig);
        //4.在convert中添加配置信息.
        converter.setFastJsonConfig(fastJsonConfig);
        return converter;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring-data-redis操作redis知识总结

    Spring-data-redis操作redis知识总结

    这篇文章主要介绍了Spring-data-redis操作redis知识总结,spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操作。
    2017-04-04
  • java导出包含多个sheet的Excel代码示例

    java导出包含多个sheet的Excel代码示例

    这篇文章主要介绍了java导出包含多个sheet的Excel,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • SpringBoot bean查询加载顺序流程详解

    SpringBoot bean查询加载顺序流程详解

    当你在项目启动时需要提前做一个业务的初始化工作时,或者你正在开发某个中间件需要完成自动装配时。你会声明自己的Configuration类,但是可能你面对的是好几个有互相依赖的Bean
    2023-03-03
  • SpringBoot中ApplicationEvent的使用步骤详解

    SpringBoot中ApplicationEvent的使用步骤详解

    ApplicationEvent类似于MQ,是Spring提供的一种发布订阅模式的事件处理方式,本文给大家介绍SpringBoot中ApplicationEvent的使用步骤详解,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • Java对xls文件进行读写操作示例代码

    Java对xls文件进行读写操作示例代码

    Java开发项目中经常会碰到处理Excel文件中数据的情况,下面这篇文章主要给大家介绍了利用Java对xls文件进行读写操作的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-08-08
  • 自定义log4j2中的Appender来获取日志内容的示例代码

    自定义log4j2中的Appender来获取日志内容的示例代码

    在 Log4j2 中,Appender 是负责将日志事件输出到目标地点的组件,本文讲述的是通过 log4j 中自定义的 Appender 来获取需要打印的日志信息,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-02-02
  • Spring Cloud Zipkin服务端追踪服务

    Spring Cloud Zipkin服务端追踪服务

    这篇文章主要介绍了Spring Cloud Zipkin服务端追踪服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • plantuml画图实现代码画时序图UML用例图

    plantuml画图实现代码画时序图UML用例图

    这篇文章主要为大家介绍了plantuml画图实现代码画时序图示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • SpringBoot中JPA更新时部分字段无效

    SpringBoot中JPA更新时部分字段无效

    本文主要介绍了SpringBoot中JPA更新时部分字段无效,在通过注解自动更新时,部分字段在调试时可以找到,却没有被自动更新到数据库中,下面就介绍一下解决方法
    2023-04-04
  • java实现非法访问异常示例

    java实现非法访问异常示例

    创建ExceptionTest类,在该类的main()方法中,使用反射获得String类的所有域,不要使用setAccessible方法修改这些域的可见性,然后通过反射获得私有域中与”hash”相匹配的int值,并使用try-catch语句块捕获非法访问异常
    2014-02-02

最新评论