后端统一处理返回前端日期LocalDateTime格式化去T,Long返回前端损失精度问题
2023-02-18 16:42:11 时间
一、前言
我们在实际开发中肯定会遇到后端的时间传到前端是这个样子的:2022-08-02T15:43:50
这个时候前后端就开始踢皮球了,!!
后端说:前端来做就可!
前端说:后端来做就可!
作为一名有责任感的后端,这种事情怎么能让前端来搞呢!
还有就是Long类型的返回到前端可能会损失精度,这个情况只能后端来做了!
解决方案还是看的开源框架,人家写的,咱就不造轮子了!直接开车!!
二、错误示范
带着T
非常不好,产品要求不带,哈哈,一切按照原型来哦!!
下面的testNum
的值是Long类型的最大值:9223372036854775807
,这样就会损失精度成:9223372036854776000
三、导入依赖
<!--json模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</dependency>
四、编写配置类
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(ObjectMapper.class)
@AutoConfigureBefore(JacksonAutoConfiguration.class)
public class JacksonConfiguration {
@Bean
@ConditionalOnMissingBean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return builder -> {
builder.locale(Locale.CHINA);
builder.timeZone(TimeZone.getTimeZone(ZoneId.systemDefault()));
// 设置日期格式
builder.simpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
// 解决long类型损失精度
builder.serializerByType(Long.class, ToStringSerializer.instance);
// 日期格式自定义类
builder.modules(new PigJavaTimeModule());
};
}
}
public class JavaTimeModule extends SimpleModule {
public JavaTimeModule() {
super(PackageVersion.VERSION);
// ======================= 时间序列化规则 ===============================
// yyyy-MM-dd HH:mm:ss
this.addSerializer(LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
// yyyy-MM-dd
this.addSerializer(LocalDate.class,
new LocalDateSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
// HH:mm:ss
this.addSerializer(LocalTime.class,
new LocalTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)));
// Instant 类型序列化
this.addSerializer(Instant.class, InstantSerializer.INSTANCE);
// ======================= 时间反序列化规则 ==============================
// yyyy-MM-dd HH:mm:ss
this.addDeserializer(LocalDateTime.class,
new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
// yyyy-MM-dd
this.addDeserializer(LocalDate.class,
new LocalDateDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
// HH:mm:ss
this.addDeserializer(LocalTime.class,
new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)));
// Instant 反序列化
this.addDeserializer(Instant.class, InstantDeserializer.INSTANT);
}
}
五、测试成果
我们发现日期的烦人的T
被去掉了!再也不用踢皮球了哦!!
我们发现后端返回的类型为Long
时,会自动变为String
类型,再也不会损失精度了,这个很容易忽视!!
如果觉得有用,一键三连起来,小编谢谢大家了!!
有缘人才可以看得到的哦!!!
相关文章
- OpenCV快速识别魔方六面颜色
- 基于图割算法的木材表面缺陷图像分割
- 金九银十,收下这份 Java String 面试题
- 从图灵机到量子计算机,计算机可以解决所有问题吗?
- 一套用了 70 年的计算机架构 —— 冯·诺依曼架构
- 图解计算机内部的高速公路 —— 总线系统
- 图解计算机的存储器金字塔
- 面试官:什么是伪共享,如何避免?
- 为什么计算机中的负数要用补码表示?
- 宝塔部分用户被挂马,官方建议暂时关闭面板
- 七天接手react项目 系列 —— 生命周期&受控和非受控组件&Dom 元素&Diffing 算法
- Redis的数据被删除,占用内存咋还那么大?
- Redis Cluster 原理说的头头是道,这些配置不懂就是纸上谈兵
- Redis进阶篇:发布订阅模式原理与运用
- Redis 内存优化神技,小内存保存大数据
- SpringBoot 集成缓存性能之王 Caffeine
- 掘地三尺搞定 Redis 与 MySQL 数据一致性问题
- Redis 的数据过期了就会马上删除么?
- Redis 为何使用近似 LRU 算法淘汰数据,而不是真实 LRU?
- Redis 内存满了怎么办?这样设置才正确!