使用FastJson解决long类型在js中失去精度
Nightliar 人气:0使用FastJson解决long类型在js中失去精度问题
1.pom中需要将默认的jackson排除掉
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- json库统一使用fastjson --> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency>
2.利用fastJson替换掉jackson
package com.nightliar.bootdemo.config.spring; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.serializer.ToStringSerializer; import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import com.nightliar.bootdemo.interceptor.GlobalInterceptor; import com.nightliar.bootdemo.interceptor.LoginInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; /** * Created by Nightliar * 2018-08-15 11:09 */ @Configuration public class WebMvcConfig implements WebMvcConfigurer { /** * 添加拦截器 */ @Override public void addInterceptors(InterceptorRegistry registry){ //全局拦截器 registry.addInterceptor(new GlobalInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/static/**"); //登陆拦截器 registry.addInterceptor(new LoginInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/static/**"); } /** * 利用fastJson替换掉jackson,且解决中文乱码问题 */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters){ FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures( SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullBooleanAsFalse, SerializerFeature.WriteNonStringKeyAsString, SerializerFeature.BrowserCompatible); //解决Long转json精度丢失的问题 SerializeConfig serializeConfig = SerializeConfig.globalInstance; serializeConfig.put(BigInteger.class, ToStringSerializer.instance); serializeConfig.put(Long.class, ToStringSerializer.instance); serializeConfig.put(Long.TYPE, ToStringSerializer.instance); fastJsonConfig.setSerializeConfig(serializeConfig); //处理中文乱码问题 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); fastConverter.setSupportedMediaTypes(fastMediaTypes); fastConverter.setFastJsonConfig(fastJsonConfig); converters.add(fastConverter); } }
springboot long精度缺失问题
/** * 解决Jackson导致Long型数据精度丢失问题 * @return */ @Bean("jackson2ObjectMapperBuilderCustomizer") public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { Jackson2ObjectMapperBuilderCustomizer customizer = new Jackson2ObjectMapperBuilderCustomizer() { @Override public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) { jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance) .serializerByType(Long.TYPE, ToStringSerializer.instance); } }; return customizer; }
问题
jackson2ObjectMapperBuilderCustomizer不生效
主要是重复了
在WebMvcConfigurer中添加
@Autowired(required = false) private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter; @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter); if (Objects.isNull(mappingJackson2HttpMessageConverter)) { converters.add(0, new MappingJackson2HttpMessageConverter()); } else { converters.add(0, mappingJackson2HttpMessageConverter); } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
加载全部内容