id为Long类型的后端处理方案
一、问题描述
痛点:js的long类型最大17位数,超过17位的数字,为将多出来的位数变成零
- 问题复现
@RequestMapping("/queryUser")
public List<User> queryUser(){
List<User> resultList = new ArrayList<>();
User user = new User();
//赋予一个long型用户ID
user.setId(123456789012345678L);
resultList.add(user);
return resultList;
}
打开浏览器,请求接口,结果如下!
二、解决方法
- 第一种办法:在后台把 long 型全改为String类型
- 对于新项目,可行;
- 对于老项目,需要改在工作量就太大了,风险也大,不推荐
- 第二种办法:使用工具进行转化把 long 型改为String类型,这种方法可以实现全局转化(推荐)
- 第三种办法:前端进行处理(目前没有很好的办法,不推荐)
我们这里选择第二种方法
2.1、Jackson 工具序列化对象
我们可以使用Jackson
工具包来实现对象序列化。SpringBoot
默认自带是jackson
,解析速率足够了。
2.2、SpringBoot 配置
- 编写一个
WebConfig
配置类,并实现自WebMvcConfigurer
,重写configureMessageConverters
方法
/**
* WebMvc配置
*/
@Configuration
@Slf4j
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
/**
*添加消息转化类
* @param list
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> list) {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = jsonConverter.getObjectMapper();
//序列换成json时,将所有的long变成string
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
list.add(jsonConverter);
}
}
其中最关键一行代码,是注册了这个转换类,从而实现将所有的 long 变成 string。
// 序列换成json时,将所有的long变成string
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
如果想对某个日期进行格式化,可以全局设置。
//全局统一日期格式
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
也可以,单独对某个属性进行设置,例如对createTime
属性格式化为yyyy-MM-dd
,只需要加上如下注解即可。
@JsonFormat(pattern="yyyy-MM-dd", timezone="GMT+8")
private Date createTime;
工具转化类写好之后,就非常简单了,只需要对 aop 拦截的方法返回的参数,进行序列化就可以自动实现将所有的 long 变成 string。
加上配置类后,重新测试,效果如图: