外贸网站建设 佛山电脑配件电子商务网站设计方案
web/
2025/9/29 11:38:39/
文章来源:
外贸网站建设 佛山,电脑配件电子商务网站设计方案,wordpress个人站,六安网站怎么做seo目录 一、问题描述二、问题复现1.Maven依赖2.application.yml 配置3.DemoController.java4.snowflakePage.html 页面5.DemoControllerAdvice.java 监听6.问题复现 三、原因分析四、问题解决方案一方案二 一、问题描述
Java 后端使用雪花算法生成 Long 类型的主键 ID#xff0… 目录 一、问题描述二、问题复现1.Maven依赖2.application.yml 配置3.DemoController.java4.snowflakePage.html 页面5.DemoControllerAdvice.java 监听6.问题复现 三、原因分析四、问题解决方案一方案二 一、问题描述
Java 后端使用雪花算法生成 Long 类型的主键 ID在返回前端后会出现后三位精度丢失的问题。 我们写一个 ControllerAdvice 打印一下返回结果看下 我们可以看到返回结果是没有问题的但是返回到前端就会丢失两位精度。
二、问题复现
这里主要描述问题的复现过程和代码不需要的可以直接跳过。
1.Maven依赖
!-- Hutool用于生成雪花算法ID --
dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.8.16/version
/dependency!-- Thymeleaf用于展示页面 --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-thymeleaf/artifactId
/dependency2.application.yml 配置
server:port: 8080spring:mvc:view:prefix: /templates/suffix: .html3.DemoController.java
import cn.hutool.core.util.IdUtil;
import com.demo.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** p Title DemoController* p Description 测试Controller** author ACGkaka* date 2023/4/24 18:02*/
Slf4j
Controller
RequestMapping(/demo)
public class DemoController {GetMapping(/snowflakePage)public String snowflakePage() {return snowflakePage;}GetMapping(/snowflakeId)ResponseBodypublic ResultObject snowflakeId() {return Result.succeed().setData(IdUtil.getSnowflakeNextId());}
}4.snowflakePage.html 页面
页面文件在 resources/templates/ 路径下。 !DOCTYPE html
html
headtitle调用接口并打印返回值/title
/head
body
button onclickgetSnowflakeId()调用接口/button
scriptfunction getSnowflakeId() {fetch(/demo/snowflakeId).then(response response.json()).then(data {console.log(data.data);document.body.innerHTML p${data.data}/p;}).catch(error console.log(error));}
/script
/body
/html5.DemoControllerAdvice.java 监听
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;/*** p Title DemoControllerAdvice* p Description Controller增强** author ACGkaka* date 2023/4/25 21:07*/
ControllerAdvice
public class DemoControllerAdvice implements ResponseBodyAdvice {Overridepublic boolean supports(MethodParameter methodParameter, Class aClass) {return true;}Overridepublic Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {System.out.println(body is: body);return body;}
}6.问题复现
请求地址http://localhost:8080/demo/snowflakePage 精度丢失问题复现下面我们来分析下导致问题的原因。
三、原因分析
后端返回1703327682407702528前端接收1703327682407702500
这是因为 JS 是弱语言前端接收数字类型参数为 number最大接受长度为 16 位超出长度则会丢失精度。而 Java 的 Long 类型长度是 19 位所以传输到前端的后三位精度丢失。
解决问题的思路把 Java 中 Long 类型转换为 String 类型返回给前端。
四、问题解决
方案一
将所有 ID 使用 String 类型存储缺点是字符串做 ID 查询效率比较低。
方案二
使用注解、配置类改变序列化过程。
注解方式适用于 pojo 的 id 属性上。
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;/*** 主键*/
TableId
JsonSerialize(using ToStringSerializer.class)
private Long id;配置类方式适用于全局配置。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;Configuration
public class JacksonConfig {BeanPrimaryConditionalOnMissingBean(ObjectMapper.class)public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder){ObjectMapper objectMapper builder.createXmlMapper(false).build();// 全局配置序修改列化返回 Json 处理方案SimpleModule simpleModule new SimpleModule();// Json Long -- StringsimpleModule.addSerializer(Long.class, ToStringSerializer.instance);objectMapper.registerModule(simpleModule);return objectMapper;}
}根据问题复现代码再次请求地址http://localhost:8080/demo/snowflakePage 精度丢失问题已修复。
整理完毕完结撒花~ 参考地址
1.解决雪花算法生成的ID传输前端后精度丢失https://blog.csdn.net/weixin_48841931/article/details/127966871
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83875.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!