springboot返回String乱码以及Long精度丢失

该贴记录一些springboot返回数据时的常见问题

1、在restController中返回String中文发生乱码

在springboot 中配置 StringHttpMessageConverter 的编码格式为UTF-8

1
2
3
4
5
6
7
8
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.forEach(converter -> {
if (converter instanceof StringHttpMessageConverter){
((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
}
});
}

2、Long在js端精度丢失

由于前段js的number可显示数问题,返回Long时会发生精度丢失现象。解决方法是将Long序列化成字符串。

在springboot 中配置 MappingJackson2HttpMessageConverter 的序列化方式,该配置在 继承自WebMvcConfigurationSupport的springmvc配置文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 建议使用该方法进行HttpMessageConverters的修改,此时的converters已经是Spring初始化过的
* 因为加入了WebMvcConfigure,导致Spring的HttpMessageConverters中的String转换类默认使用ISO-8859-1编码
* 所以这里对Spring已经初始化过的StringHttpMessageConverter的编码进行修改
* @param converters /
*/
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.forEach(converter -> {
// 解决返回String类型时中文乱码
if (converter instanceof StringHttpMessageConverter){
((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
}
// 解决返回Long类型字段精度丢失
if (converter instanceof MappingJackson2HttpMessageConverter){
MappingJackson2HttpMessageConverter c = (MappingJackson2HttpMessageConverter) converter;
SimpleModule module = new SimpleModule();
module.addSerializer(Long.class, ToStringSerializer.instance);
module.addSerializer(Long.TYPE, ToStringSerializer.instance);
c.getObjectMapper().registerModule(module);
}
});
}

一个小问题

在网上找到一种解决方案,在Application启动类中加上如下代码

1
2
3
4
5
6
7
8
9
10
/**
* 解决Jackson导致Long型数据精度丢失问题
* @return
*/
@Bean("jackson2ObjectMapperBuilderCustomizer")
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder
.serializerByType(Long.class, ToStringSerializer.instance)
.serializerByType(Long.TYPE, ToStringSerializer.instance);
}

但一直没有效果,不知道什么原因,直到晚上回家,自己新建一个项目也加上了这串代码,然后神奇的是居然可以了,后来又琢磨了许久发现是:

当你的项目中有自定义的SpringMvcConfig(继承自WebMvcConfigurationSupport )时候,上述代码就会失效。于是想到在HttpMessageConverter 中找到 jackson序列化器,直接在上面修改。