Spring web接口定义的Long类型属性,为啥返回给前端变成了字符串

54 阅读1分钟

问题描述

spring web项目提供给前端一个http接口,接口返回中存在一个Long类型属性phoneNum,如下:

public class User implements Serializable {
    private static final long serialVersionUID = -7208500744108845919L;
    
    private String name;
    
    private Integer age;
    
    private Long phoneNum;

但是通过测试发现,接口返回中phoneNum返回字符串,如下:

{
    "code": 0,
    "message": {
        "name": "小明",
        "age": 23,
        "phoneNum": "1234567890"
    }
}

问题分析

前端解析Long类型时,存在精度丢失的问题;所以服务端统一经Long类型转化为了String类型,代码配置如下:

@EnableWebMvc
@Configuration
public class WebDataConvertConfig implements WebMvcConfigurer {
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
      MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
      ObjectMapper objectMapper = new ObjectMapper();
      /**
       * 序列换成json时,将所有的long变成string
       * 因为js中得数字类型不能包含所有的java long值
       */
      SimpleModule simpleModule = new SimpleModule();
      simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
      simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
      simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);

      ......
    }
}