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
|
@Override protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) { converters.forEach(converter -> { if (converter instanceof StringHttpMessageConverter){ ((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8); } 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
|
@Bean("jackson2ObjectMapperBuilderCustomizer") public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder .serializerByType(Long.class, ToStringSerializer.instance) .serializerByType(Long.TYPE, ToStringSerializer.instance); }
|
但一直没有效果,不知道什么原因,直到晚上回家,自己新建一个项目也加上了这串代码,然后神奇的是居然可以了,后来又琢磨了许久发现是:
当你的项目中有自定义的SpringMvcConfig(继承自WebMvcConfigurationSupport )时候,上述代码就会失效。于是想到在HttpMessageConverter 中找到 jackson序列化器,直接在上面修改。