在实际的前后端交互中,特别是在使用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类型数据转换为字符串形式发送至前端,有效解决了大整数在前端展示时可能发生的精度丢失问题。
评论区