侧边栏壁纸
  • 累计撰写 32 篇文章
  • 累计创建 38 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Spring Boot中通过注解及全局配置解决Long类型到String转换以防止前端精度丢失问题

一杯香梨
2022-01-01 / 0 评论 / 0 点赞 / 9 阅读 / 0 字

在实际的前后端交互中,特别是在使用Spring Boot作为后端框架,并结合Jackson库进行JSON序列化与反序列化的过程中,时常会遇到Java中的Long类型数值在传送到JavaScript环境时因精度限制而导致数据丢失的问题。这是因为JavaScript内部对于大整数(尤其是超过Number.MAX_SAFE_INTEGER范围的)处理并不精确。针对此问题,本文将基于CSDN博主的文章,介绍如何在Spring Boot项目中通过注解以及全局配置的方式将Long类型自动转换为String,确保前端能准确无误地接收长整型数值。

方法一:使用@JsonSerialize注解局部处理

对于仅需个别字段进行Long转String的场景,可以利用Jackson库提供的@JsonSerialize注解,配合ToStringSerializer类,直接在模型类的Long属性上进行标注:

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
​
public class ExampleModel {
    @JsonSerialize(using = ToStringSerializer.class)
    private Long largeId = 1332345432341123411L;
    // 其他属性...
}

通过这种方式,该特定字段在被转化为JSON时,将会以字符串形式输出,从而避免前端接收时可能发生的精度损失。

方法二:全局配置SimpleModule

如果希望在整个应用中统一处理所有Long类型的序列化行为,可以创建一个继承自com.fasterxml.jackson.databind.Module的配置类,如JsonModuleConfig,并在其中注册ToStringSerializer

import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
​
@Configuration
public class JsonModuleConfig extends SimpleModule {
​
    public JsonModuleConfig() {
        // 添加Long类型和基本类型的Long的序列化处理器
        this.addSerializer(Long.class, ToStringSerializer.instance);
        this.addSerializer(Long.TYPE, ToStringSerializer.instance);
    }
}

这样,整个应用中所有的Long类型在序列化为JSON时,都将自动转为字符串。

方法三:通过WebMvcConfigurer接口配置转换规则

若需要全局控制HTTP消息转换器的行为,可以创建一个实现了WebMvcConfigurer接口的配置类,如WebDataConvertConfig,并在其中定制Jackson的ObjectMapper配置:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
​
import java.util.List;
​
@Configuration
@EnableWebMvc
public class WebDataConvertConfig implements WebMvcConfigurer {
​
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 创建并配置ObjectMapper
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance); // 同样处理BigInteger类型
​
        // 设置反序列化时忽略未知属性
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
​
        // 注册模块到ObjectMapper
        objectMapper.registerModule(simpleModule);
​
        // 创建并配置MappingJackson2HttpMessageConverter
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        jackson2HttpMessageConverter.setObjectMapper(objectMapper);
​
        // 将配置好的MappingJackson2HttpMessageConverter添加到转换器列表中
        converters.add(jackson2HttpMessageConverter);
    }
}

通过以上配置,Spring MVC框架在处理HTTP响应时,将会自动将所有Long类型数据转换为字符串形式发送至前端,有效解决了大整数在前端展示时可能发生的精度丢失问题。

0

评论区