網站首頁 編程語言 正文
今天在做項目的時候發現了一個小問題:
當點擊禁用的時候,賬號狀態并沒有發生改變,但也沒有報錯,這是為什么呢?
??接下來檢查發現前端傳回來的ID發生了精度缺失,如下圖:
? 這是數據庫里面的id值
?這是前端傳過來的值
?發現了李四的ID發生了精度缺失,問題實際上, 就出現在前端JS中, js在對長度較長的長整型數據進行處理時, 會損失精度, 從而導致提交的id和數據庫中的id不一致。
那我們怎么解決這個問題呢,
?當然是向前端傳遞的時候把ID轉為String類型即可,就避免了精度缺失的問題
具體步驟如下:
由于在SpringMVC中, 將Controller方法返回值轉換為json對象, 是通過jackson來實現的, 涉及到SpringMVC中的一個消息轉換器MappingJackson2HttpMessageConverter, 所以我們要解決這個問題, 就需要對該消息轉換器的功能進行拓展。 ?
1. 提供對象轉換器JacksonObjectMapper,基于Jackson進行Java對象到json數據的轉換。
2. 在WebMvcConfig配置類中擴展Spring mvc的消息轉換器,在此消息轉換器中使用提供的對象轉換器進行Java對象到json數據的轉換。
順便對日期的格式也進行轉換。
?對象轉換器
package com.pyh.reggie.common;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import java.math.BigInteger;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
/**
* 對象映射器:基于jackson將Java對象轉為json,或者將json轉為Java對象
* 將JSON解析為Java對象的過程稱為 [從JSON反序列化Java對象]
* 從Java對象生成JSON的過程稱為 [序列化Java對象到JSON]
*/
public class JacksonObjectMapper extends ObjectMapper {
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
public JacksonObjectMapper() {
super();
//收到未知屬性時不報異常
this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
//反序列化時,屬性不存在的兼容處理
this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
SimpleModule simpleModule = new SimpleModule()
.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
.addSerializer(BigInteger.class, ToStringSerializer.instance)
.addSerializer(Long.class, ToStringSerializer.instance)
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
//注冊功能模塊 例如,可以添加自定義序列化器和反序列化器
this.registerModule(simpleModule);
}
}
擴展MVC框架的消息轉換器
/**
* 擴展mvc框架的消息轉換器
* @param converters
*/
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
log.info("設置消息轉換器");
//創建消息轉換器對象
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
//設置對象轉換器,底層使用Jackson將Java對象轉為json
messageConverter.setObjectMapper(new JacksonObjectMapper());
//將上面的消息轉換器對象追加到mvc框架的轉換器集合中
converters.add(0,messageConverter);
}
?然后我們重新運行代碼,即可發現ID已經被轉換為String類型,并功能已經生效
原文鏈接:https://blog.csdn.net/weixin_43860310/article/details/121429006
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-07-27 Python中的pandas表格模塊、文件模塊和數據庫模塊_python
- 2022-12-27 python空值判斷方式(if?xxx和if?xxx?is?None的區別及說明)_python
- 2022-10-02 SQL堆疊注入簡介_MsSql
- 2022-05-26 Redis?操作多個數據庫的配置的方法實現_Redis
- 2023-03-25 Rust你不認識的所有權_Rust語言
- 2022-03-24 shell腳本查看k8s日志介紹_linux shell
- 2022-06-27 使用Golang搭建web服務的實現步驟_Golang
- 2022-05-26 一起來學習C#的觀察者模式_C#教程
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支