網(wǎng)站首頁 編程語言 正文
今天在做項(xiàng)目的時(shí)候發(fā)現(xiàn)了一個(gè)小問題:
當(dāng)點(diǎn)擊禁用的時(shí)候,賬號(hào)狀態(tài)并沒有發(fā)生改變,但也沒有報(bào)錯(cuò),這是為什么呢?
??接下來檢查發(fā)現(xiàn)前端傳回來的ID發(fā)生了精度缺失,如下圖:
? 這是數(shù)據(jù)庫里面的id值
?這是前端傳過來的值
?發(fā)現(xiàn)了李四的ID發(fā)生了精度缺失,問題實(shí)際上, 就出現(xiàn)在前端JS中, js在對(duì)長(zhǎng)度較長(zhǎng)的長(zhǎng)整型數(shù)據(jù)進(jìn)行處理時(shí), 會(huì)損失精度, 從而導(dǎo)致提交的id和數(shù)據(jù)庫中的id不一致。
那我們?cè)趺唇鉀Q這個(gè)問題呢,
?當(dāng)然是向前端傳遞的時(shí)候把ID轉(zhuǎn)為String類型即可,就避免了精度缺失的問題
具體步驟如下:
由于在SpringMVC中, 將Controller方法返回值轉(zhuǎn)換為json對(duì)象, 是通過jackson來實(shí)現(xiàn)的, 涉及到SpringMVC中的一個(gè)消息轉(zhuǎn)換器MappingJackson2HttpMessageConverter, 所以我們要解決這個(gè)問題, 就需要對(duì)該消息轉(zhuǎn)換器的功能進(jìn)行拓展。 ?
1. 提供對(duì)象轉(zhuǎn)換器JacksonObjectMapper,基于Jackson進(jìn)行Java對(duì)象到j(luò)son數(shù)據(jù)的轉(zhuǎn)換。
2. 在WebMvcConfig配置類中擴(kuò)展Spring mvc的消息轉(zhuǎn)換器,在此消息轉(zhuǎn)換器中使用提供的對(duì)象轉(zhuǎn)換器進(jìn)行Java對(duì)象到j(luò)son數(shù)據(jù)的轉(zhuǎn)換。
順便對(duì)日期的格式也進(jìn)行轉(zhuǎn)換。
?對(duì)象轉(zhuǎn)換器
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;
/**
* 對(duì)象映射器:基于jackson將Java對(duì)象轉(zhuǎn)為json,或者將json轉(zhuǎn)為Java對(duì)象
* 將JSON解析為Java對(duì)象的過程稱為 [從JSON反序列化Java對(duì)象]
* 從Java對(duì)象生成JSON的過程稱為 [序列化Java對(duì)象到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();
//收到未知屬性時(shí)不報(bào)異常
this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
//反序列化時(shí),屬性不存在的兼容處理
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)));
//注冊(cè)功能模塊 例如,可以添加自定義序列化器和反序列化器
this.registerModule(simpleModule);
}
}
擴(kuò)展MVC框架的消息轉(zhuǎn)換器
/**
* 擴(kuò)展mvc框架的消息轉(zhuǎn)換器
* @param converters
*/
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
log.info("設(shè)置消息轉(zhuǎn)換器");
//創(chuàng)建消息轉(zhuǎn)換器對(duì)象
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
//設(shè)置對(duì)象轉(zhuǎn)換器,底層使用Jackson將Java對(duì)象轉(zhuǎn)為json
messageConverter.setObjectMapper(new JacksonObjectMapper());
//將上面的消息轉(zhuǎn)換器對(duì)象追加到mvc框架的轉(zhuǎn)換器集合中
converters.add(0,messageConverter);
}
?然后我們重新運(yùn)行代碼,即可發(fā)現(xiàn)ID已經(jīng)被轉(zhuǎn)換為String類型,并功能已經(jīng)生效
原文鏈接:https://blog.csdn.net/weixin_43860310/article/details/121429006
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2024-03-25 在SpringBoot中系統(tǒng)異常和自定義的異常的統(tǒng)一處理
- 2022-09-23 C/C++中的靜態(tài)變量注意事項(xiàng)_C 語言
- 2022-07-21 Python中直接賦值、淺拷貝和深拷貝的區(qū)別
- 2023-01-01 Echarts改變柱狀圖顏色
- 2024-03-21 解決SpringBoot項(xiàng)目中的報(bào)錯(cuò):Could not autowire,no beans of
- 2024-04-06 MyBatis的一級(jí)(同SqlSession會(huì)話),二級(jí)(不同SqlSession會(huì)話)緩存使用
- 2022-06-06 PyTorch?device與cuda.device用法介紹_python
- 2022-01-10 egg作為后端接口,在前端調(diào)用
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支