日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

向前端傳遞Long類型數(shù)據(jù)時(shí)發(fā)生精度缺失解決辦法

作者:Never-say-never1 更新時(shí)間: 2023-10-16 編程語言

今天在做項(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

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新