後端統一處理返回前端日期LocalDateTime格式化去T,Long返回前端損失精度問題

2022-10-21 12:03:56

一、前言

我們在實際開發中肯定會遇到後端的時間傳到前端是這個樣子的: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型別,再也不會損失精度了,這個很容易忽視!!

如果覺得有用,一鍵三連起來,小編謝謝大家了!!


有緣人才可以看得到的哦,歡迎關注小編公眾號,文章首發搶先看,謝謝大家!!!

點選存取!小編自己的網站,裡面也是有很多好的文章哦!