您的位置:首页 > 编程语言 > Java开发

后台到前台Long类型数据精度丢失 springboot1.0和spring2.0版本处理方式的区别

2020-01-14 06:20 344 查看

spring1.0+的全局转换器

配置类实现WebMvcConfigurerAdapter或者WebMvcConfigurer,然后重写configureMessageConverters方法。
注:springMvc也可以这样处理

@Configuration
public class MvcConfigure implements WebMvcConfigurer {

/**
* @Description 返回值序列化配置
* @Date 10:34 2019/10/28
**/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
//将long类型转为字符串 防止精度丢失
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(jackson2HttpMessageConverter);
}
/**
* @Description 跨域配置
* @Date 10:33 2019/10/28
**/
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.setAllowCredentials(true);
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}

如果你的项目用的是springboot2以上的版本,虽然注入了进去,但是精度依然丢失

spring2.0+的全局转换器

## 方法一:
在配置文件中加入

jackson:
generator:
write_numbers_as_strings: true

该方式会强制将所有数字全部转成字符串输出,包括按照timestamp时间戳以及定义的统一返回对象0成功 1失败也是如此。
## 方法二:
在启动类上加入下面配置

@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); //解决Long类型精度丢失问题
}
};
return customizer;
}

## 方法三:
也是通用方法无论什么版本都可以,但是springmvc需要自己通过Maven配置jackson依赖,springboot默认依赖jackson包,不需要额外引入依赖.

在返回实体的set方法上加上
@JsonSerialize(using = ToStringSerializer.class)

@JsonSerialize(using = ToStringSerializer.class) //防止Long类型的精度丢失
public void setCoId(Long coId) {
this.coId = coId;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
你我都是手艺人 发布了8 篇原创文章 · 获赞 1 · 访问量 278 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐