Spring MVC自定义消息转换器(可解决Long类型数据传入前端精度丢失的问题)

ArcGIS天地图矢量化秘籍:用重分类+ArcScan高效提取建筑轮廓线 本文详细介绍了利用ArcGIS重分类和ArcScan技术高效提取天地图建筑轮廓线的半自动化流程。通过动态中断值计算、多级重分类策略和ArcScan高级矢量化技巧,显著提升城市规划中的矢量化效率与精度,适用于中级GIS用户。 阅读详情

博客原文地址:https://www.cnblogs.com/Fly-Bob/p/7218006.html


对于Long 类型的数据,如果我们在Controller层通过@ResponseBody将返回数据自动转换成json时,不做任何处理,而直接传给前端的话,在Long长度大于17位时会出现精度丢失的问题。至于为啥丢失,我们在此处不探讨。

如图所示:后端返回数据如下:

而前端接收的数据时就丢失了精度

2、简单分析

首先,我们分析一下@ResponseBody是怎样将一个普通的对象转换成Json对象返回。

@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器(默认使用MappingJackson2HttpMessageConverte(Spring 4.x以下使用的是MappingJackson2HttpMessageConverte))转换为指定的格式之后,写入到response对象的body区,需要注意的是,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

作用等同于response.getWriter.write(JSONObject.fromObject(user).toString());

3、怎么处理

总的来说主要有两种处理方式

如何避免精度丢失呢?最常用的办法就是待转化的字段统一转成String类型

那么怎样转化呢?

一般有两种方式:

首先我们要在maven中添加必须的依赖

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.6</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.6</version>
        </dependency>

方式一.

1、在待转化的字段之上加上@JsonSerialize(using=ToStringSerializer.class)注解,如图所示:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class ProductVo {

    @JsonSerialize(using=ToStringSerializer.class)
    private Long productId

    private String productName;
    get,set省略

Controller方法不需要特殊处理,但是使用这种时,如果需要转换的字段较多,就显得比较繁琐。

让我们看看效果

 

方法二.

所以,我们可以采用配置spring的消息转换器的ObjectMapper为自定义的类

public class CustomObjectMapper extends ObjectMapper {

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

然后,我们还需要在SpringMVC的配置文件中加上如下配置

<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.jay.jackson.util.CustomObjectMapper">
                        <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>

 至此就大功告成了,Controller方法不需要特殊处理,代码如下:

/**
     * 跳转到首页
     * @param request
     * @param response
     */
    @RequestMapping(value="/index", method = RequestMethod.GET)
    public String page(HttpServletRequest request, HttpServletResponse response){
        return "/index";
    }

    @RequestMapping(value = "/getProducts",method = RequestMethod.POST)
    @ResponseBody
    public List getProducts(HttpServletRequest request,HttpServletResponse response){
        List<ProductVo> productVos=new ArrayList<>();
        for (int i=1;i<=2;i++){
            ProductVo productVo= new ProductVo();
            productVo.setProductId(20170720125047233L+i);
            productVo.setProductName("测试商品"+i);
            productVos.add(productVo);
        }
        return productVos;
    }

    @RequestMapping(value = "/getUsers",method = RequestMethod.POST)
    @ResponseBody
    public List<UserVo> getUsers(){
        List<UserVo> userVos=new ArrayList<>();
        for (int i=1;i<=2;i++){
            UserVo userVo=new UserVo();
            userVo.setUserid((long)i);
            userVo.setUserName("测试用户"+i);
            userVo.setCreateTime(new Date());
            userVos.add(userVo);
        }
        return userVos;
    }

我们来看效果。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190109170416663.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VuZGxlYWY=,size_16,color_FFFFFF,t_70) 相关代码:https://github.com/XWxiaowei/JavaWeb.git
scannet数据集下载文件 scannet数据集下载文件 由于大家会申请scannet数据集,审批比较慢,我将下载的文件里面的内容贴出来,大家可以复制放进py文件中,运行就可以下载 ps:别再私信要数据集了,这个自己下载,如果光三维数据的话,还是很快的,当然如果路由器翻了墙的话,下载会更快。 #!/usr/bin/env python # Downloads ScanNet public data release # Run with ./download-scannet.py (or python download-scannet. 阅读详情

相关推荐

单卡调试OpenGait:从分布式到本地的轻量级改造指南

本文为个人开发者和研究者提供了一份详细的OpenGait框架单卡调试指南。针对该框架默认依赖多GPU分布式训练的问题,文章通过分析核心痛点,逐步讲解了如何从环境搭建、绕过分布式初始化陷阱、处理通信后端报错到最终配置与调试,实现从分布式到本地的轻量级改造,帮助读者在单张GPU上高效进行步态识别模型的验证与学习。

weixin_28223453的博客 138

@JsonSerialize(using = ToStringSerializer.class)

场景: id为long,传到后台就变了值 。 测试一下,这个要是只有几位数的情况下,其实都不需要这个注解,大于某个值,19位数的时候就会出问题 解决办法:在实体类上面添加这个注解就可以了。 原因:使用fastjson的ToStringSerializer注解,让系统序列化时,保留相关精度。 ToStringSerializer是一个类,还有一个与它类似的是 @JsonSerialize(using = LongToStringUtil.class) 和前端交互时,值比number数值更大,会导致精度缺失

weixin_45933454的博客 6608

关于WPF PasswordBox 增加提示文案,请输入密码,亲测最快方案,改最少的代码!!!

关于WPF PasswordBox 增加提示文案,请输入密码,亲测最快方案,不需要像其他方案改任何PasswordBox的样式,直接加个texbox控件显示隐藏即可1.xaml,注意关键代码,样式之类可以不管 2.xaml.cs

鸣的博客 1542

Spring mvc mybatis 查询结果缺少字段

SQL  select   ID       from property_value_set 1、现象      Select 语句单纯执行sql语句查询成功,controller断点Debut发现有字段值丢失,丢失字段为keyInfo、createBy、createTm。 2、问题      根源查询结果字段名与类属性名不完全一致。 3、解决        在Mapper.xml

xiaofeifei8421的专栏 6207

【智能制造】- APS系列|05 APS 排产的五大底层算法逻辑

很多人误以为APS只是给生产工单排先后顺序,实则整套系统依托成熟算法体系,完成多维度约束下的最优生产决策在制造业数字化排产普及的当下,依旧有不少制造管理者对APS存在认知误区,将其等同于简易工单排序工具。事实上,专业级高级计划与排程系统,早已脱离单纯按时间排序的基础功能,而是依托一整套成熟完善的底层算法逻辑,整合现场各类生产限制条件,在海量变量中自动推演、筛选、输出最贴合企业经营目标的生产方案。

qq_40821260的博客 433

华为OD机试真题2025双机位C卷 Python&JS 实现【卡牌游戏】

小明正在尝试一种新的牌游戏。游戏规则只如下:首先,小明拿到一张写有数字m的牌。 然后,他会拿到另外n张牌,上面分别写有不同的数字,牌排成一排。小明的目标是从这排牌中找到一串连续的牌,这些牌上数字的总和可以被 m整除。你的任务是判断小明是否可以完成这个目标。

MISAYAONE的博客 403

springMVC:modelandview,model,controller,参数传递

1.web.xml 配置:   dispatcher org.springframework.web.servlet.DispatcherServlet 加载/WEB-INF/spring-mvc/目录下的所有XML作为Spring MVC的配置文件 contextConfigLocation /WEB-INF/spring-mvc/*.xml 1 dispa

球球之家 2万+

WPF实战项目十七(客户端):数据等待加载弹框动画

1、在Common文件夹下新建文件夹Events,新建扩展类UpdateLoadingEvent。2、新建一个静态扩展类DialogExtensions来编写注册和推送等待消息弹框方法。3、在ViewModel中添加实现类NavigationViewModel。5、在View文件夹下新建用户控件ProgressView.xmal。4、在主窗体MainView.xmal中给弹窗界面命名。6、在MainView.xmal.cs中注册消息。

yigu4011的博客 2346

spring MVC的Controller中使用ModelAndView传数据给前端jsp接收不到的问题

前端错误: ${message} 原因: 1、错误的导包 错误:org.springframework.web.portlet.ModelAndView; 正确:org.springframework.web.servlet.ModelAndView; 2、使用maven创建项目自动生成的web.xml问题 错误: <!DOCTYPE web-a...

CurryFor3的博客 856

【RBF预测】基于粒子群算法优化RBF神经网络实现数据回归预测含Matlab源码

1 简介 原油含水率预测对于确定油井水,油层位以及估计原油产量有着非常重要意义.BP神经网络是最近常用的原油含水率预测方法,然而,由于BP神经网络存在容易陷入局部极小值,收敛速度慢等问题,影响了其预测的实用性和准确性,对此,提出基于粒子群优化RBF神经网络(PSO-RBFNN)的原油含水率预测方法,粒子群优化算法用于RBF神经网络参数优化.在分析原油含水率预测的影响因素基础上,建立粒子群优化RBF神经网络的原油含水率预测模型.实验结果表明,在原油含水率预测中,基于粒子群优化RBF神经网络比BP神经网络有着

qq_59747472的博客 1232

基于STM32设计的环境检测系统(OneNet)_365

本项目设计并实现了一种基于STM32F103RCT6单片机的环境检测系统,系统集成了多种传感器模块,具备对环境温湿度、烟雾浓度、易燃气体浓度、一氧化碳浓度和整体空气质量的实时检测功能。系统通过1.44寸SPI接口LCD实现本地数据显示,同时配备有源蜂鸣器用于环境异常报警。在数据通信方面,系统利用ESP8266-WIFI模块,采用MQTT协议将各类传感器数据上传至OneNet云平台,并借助其可视化框架实现网页端可视化界面,可通过电脑和手机浏览器远程访问,实现环境数据的远程监控。该系统设计结构简单、功能全面,适

2189

java long精度丢失_java的long类型转为json格式后,js中精度丢失问题

环境:使用spring mvc 配置json消息转换器为MappingJackson2HttpMessageConverter发现long类型的数据到了js端会丢失精度解决方案:将long统一转为string类型方法一:数据层转换,由于项目使用了spring 的jdbc模版类,查询时调用了spring的query方法public List query(String sql, SqlParamet...

weixin_39708822的博客 300

数据挖掘实战-基于LSTM时间序列模型的香烟销售预测分析

本文介绍了基于LSTM时间序列模型的香烟销售预测分析实验。实验背景为烟草市场竞争激烈,企业需提高销售预测准确性以优化生产、库存和营销策略。LSTM模型因其处理长序列数据的能力被选为预测工具。实验步骤包括数据准备、特征工程、模型构建、训练与评估及结果分析。数据集来自某市门店的销售数据,技术工具为Python 3.9和Jupyter Notebook。实验过程涵盖数据导入、预处理、产品销售与区域销售分析、销售预测(包括销售额、销量、利润及海通店销售额预测)。

m0_64336780的博客 8951

java的long类型转为json格式后,js中精度丢失问题

java的long类型转为json格式后,js中精度丢失问题 环境: 使用spring mvc 配置json消息转换器为MappingJackson2HttpMessageConverter 发现long类型的数据到了js端会丢失精度 解决方案: 将long统一转为string类型 方法一: 数据层转换,由于项目使用了spring 的jdbc模版类,查询时调用了spr

linkkb的博客 814

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

解决springmvc的long数据响应到前端是转换成json数据是数据精度问题

案例:在使用mybatis-plus来进行添加数据时,自动增长的id值是使用雪花算法来生成19为的 id值的。而在响应到前端时,我们是通过json数据响应到前端页面进行显示的。而json转换数据对数值类型最大长度是16为的,超过16位,后的则进行四舍五入。在我们通过前端请求通过id修改数据时就会造成数据精度丢失了。数据库中的数据id:通过前端传入的id:从两张图可以发现id值出现了精度丢失问题,在通过id修改时,就没有查找到数据库表中的对应的id值。

m0_62498006的博客 404

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

对于查询数据库中id值为Int类型,而前端出现精度缺失问题的解决方法

用于解决查询出数据后传入前端导致精度丢失问题。

re_dream的博客 692

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

新项目工具

设计一个生产级线程池配置,同时无缝集成,保证上下文自动传递。的代码在Controller 方法实际被调用前的一瞬间执行,负责将方法的参数“翻译”成实际的 Java 对象,然后被 Spring 传入方法。它不在请求处理的整个“前处理”阶段之前,而是在前处理(认证、日志等)完成之后、业务逻辑开始之前的那个临界点。

m0_62474094的博客 265

JAVA JSON XML PDF ZIP介绍

FastJson是阿里巴巴公司提供的一个用Java语言编写的高性能功能完善的JSON库,该库涉及的最基本功能就是序列化和反序列化。Fastjson支持java bean的直接序列化,同时也支持集合、Map、日期、Enum和泛型等的序列化。你可以使用com.alibaba.fastjson.JSON这个类进行序列化和反序列化,常用的序列化操作都可以在JSON类上的静态方法直接完成。Fastjson采用独创的算法,将parse的速度提升到极致,号称超过所有Json库。而且,使用Fastjson解析时,除了需要使

hudeyong926的专栏 615

Java面试常见八股文

覆盖索引:查询时使用了索引,并且需要返回的列,在该索引中全部能够找到回表:通过非聚簇索引,找到对应的主键id值,再到聚簇索引中,根据主键id查询到叶子结点中存储的整行数据两个或两个以上的线程在执行过程中,因争夺共享资源而造成的一种互相等待的现象死锁的四个条件互斥:共享资源X和Y只能被一个线程占用请求与保持:线程T1已经取得共享资源X,在等待共享资源Y时,不会释放共享资源X不可抢占:其他线程不能强行抢占线程T1占有的资源循环等待:线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源。

m0_59372522的博客 634

springMvc@ModelAttribute注解处理修改数据缺失

@ModelAttribute public void getEmployee(@RequestParam(value="id",required=false)Integer id ,Map map) { System.out.println("--------------"); if(id !=null) { Employee employee=employeeService.GetB

qq_38718211的博客 1083

spring mvc 后端 long 类型数字,传给前端之后,精度缺失的问题

这个数字类型的数据在后台debug的时候,看到的是真真的,没毛病,但是,在浏览器的network里面,看请求的结果。到前端之后,就变啦。具体看图。 然后,就因为这个精度缺失,导致一系列后续操作,不符合预期啦。 对于Long 类型的数据,如果我们在Controller层通过@ResponseBody将返回数据自动转换成json时,不做任何处理,而直接传给前端的话,在Long长度大于17位时会...

请叫我大师兄 2594

@JsonSerialize(using = ToStringSerializer.class) 用法及注意事项

把指定的类型转化String类型返给前端。

qq_30272167的博客 5786
上一篇: Eclipse正常启动Tomcat无法访问项目
下一篇: 多模式架构打包_Could not resolve dependencies for project
半盏清风
博客等级 码龄9年 7粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值