Java8中對(duì)于LocalDateTime的序列化和反序列化問(wèn)題
Java8對(duì)于LocalDateTime的序列化和反序列化
這里以jackjson為例
配置反序列化工具
/** * 時(shí)間戳反序列化時(shí)間 * * @author liuyuantao */ public class Str2LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> { private static final String STANDARD_PATTERN = "yyyy-MM-dd HH:mm:ss"; @Override public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { DateTimeFormatter formatterDateTime = DateTimeFormatter.ofPattern(STANDARD_PATTERN); String timeStr = jsonParser.getValueAsString(); return LocalDateTime.parse(timeStr, formatterDateTime); } }
解決1:
配置全局日期格式化
@Configuration public class WebMvcConfig implements WebMvcConfigurer { ? ? @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}") ? ? private String pattern; ? ? @Bean ? ? public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { ? ? ? ? return builder -> { ? ? ? ? ? ? DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); ? ? ? ? ? ? //返回時(shí)間數(shù)據(jù)序列化 ? ? ? ? ? ? builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); ? ? ? ? ? ? //接收時(shí)間數(shù)據(jù)反序列化 ? ? ? ? ? ? builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); ? ? ? ? }; ? ? } }
解決2:
在LocalDateTime 實(shí)體類使用注解
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime issueDate;
springboot添加LocalDateTime等java8時(shí)間類序列化和反序列化的支持
由于項(xiàng)目將原有的 Date類型的字段改造為 LocalDate,LocalDateTime,LocalTime 類型, 發(fā)現(xiàn) spring 對(duì)項(xiàng)目的時(shí)間格式無(wú)法自動(dòng)轉(zhuǎn)換,故需手動(dòng)配置下。
在spring boot 中需在 maven 中引入 jsr-310 的支持
<dependency> ? ? ? ? ?<groupId>com.fasterxml.jackson.datatype</groupId> ? ? ? ? ?<artifactId>jackson-datatype-jsr310</artifactId> ?</dependency>
或者直接引用
<dependency> ? ? ? ? ? ? <groupId>org.springframework.boot</groupId> ? ? ? ? ? ? <artifactId>spring-boot-starter-json</artifactId> </dependency>
因?yàn)? spring boot 是使用 jackson 作為 json 序列化和反序列化工具的,故只需配置 jackson 即可。
配置如下:
@Configuration public class JacksonConfig { ? ? @Bean ? ? public ObjectMapper objectMapper(){ ? ? ? ? ObjectMapper objectMapper = new ObjectMapper(); ? ? ? ? objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); ? ? ? ? objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE); ? ? ? ? JavaTimeModule javaTimeModule = new JavaTimeModule(); ? ? ? ? javaTimeModule.addSerializer(LocalDateTime.class,new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_TIME_FORMAT))); ? ? ? ? javaTimeModule.addSerializer(LocalDate.class,new LocalDateSerializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_FORMAT))); ? ? ? ? javaTimeModule.addSerializer(LocalTime.class,new LocalTimeSerializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_TIME_FORMAT))); ? ? ? ? javaTimeModule.addDeserializer(LocalDateTime.class,new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_TIME_FORMAT))); ? ? ? ? javaTimeModule.addDeserializer(LocalDate.class,new LocalDateDeserializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_FORMAT))); ? ? ? ? javaTimeModule.addDeserializer(LocalTime.class,new LocalTimeDeserializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_TIME_FORMAT))); ? ? ? ? objectMapper.registerModule(javaTimeModule).registerModule(new ParameterNamesModule()); ? ? ? ? return objectMapper; ? ? } }
public class Constants { ? ? /** 默認(rèn)日期時(shí)間格式 */ ? ? public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; ? ? /** 默認(rèn)日期格式 */ ? ? public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; ? ? /** 默認(rèn)時(shí)間格式 */ ? ? public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss"; }
然后只需要在實(shí)體類中對(duì)應(yīng)的時(shí)間類型上使用 @DateTimeFormat 和 @JsonFormat 即可。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis有查詢結(jié)果但存不進(jìn)實(shí)體類的解決方案
這篇文章主要介紹了Mybatis有查詢結(jié)果但存不進(jìn)實(shí)體類的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11Kotlin中?StateFlow?或?SharedFlow?的區(qū)別解析
Kotlin協(xié)程中的StateFlow和SharedFlow是響應(yīng)式數(shù)據(jù)流,分別用于UI狀態(tài)管理和事件通知,StateFlow有初始值,只保留最新值,適用于UI狀態(tài)管理;SharedFlow沒(méi)有初始值,可以配置緩存大小,適用于事件通知,感興趣的朋友一起看看吧2025-03-03java數(shù)組與以逗號(hào)分隔開(kāi)的字符串的相互轉(zhuǎn)換操作
這篇文章主要介紹了java數(shù)組與以逗號(hào)分隔開(kāi)的字符串的相互轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Java求素?cái)?shù)和最大公約數(shù)的簡(jiǎn)單代碼示例
這篇文章主要介紹了Java求素?cái)?shù)和最大公約數(shù)的簡(jiǎn)單代碼示例,其中作者創(chuàng)建的Fraction類可以用來(lái)進(jìn)行各種分?jǐn)?shù)運(yùn)算,需要的朋友可以參考下2015-09-09springboot實(shí)現(xiàn)用戶名查找用戶功能
本文主要介紹了springboot實(shí)現(xiàn)用戶名查找用戶功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Java BufferedReader相關(guān)源碼實(shí)例分析
這篇文章主要介紹了Java BufferedReader相關(guān)源碼實(shí)例分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10使用MUI框架構(gòu)建App請(qǐng)求http接口實(shí)例代碼
下面小編就為大家分享一篇使用MUI框架構(gòu)建App請(qǐng)求http接口實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01SpringBoot項(xiàng)目中公共字段填充的實(shí)現(xiàn)
本文主要介紹了SpringBoot項(xiàng)目中公共字段填充的實(shí)現(xiàn),利用SpringBoot的Aop思想和自定義注解和反射機(jī)制的方法來(lái)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Java利用文件輸入輸出流實(shí)現(xiàn)文件夾內(nèi)所有文件拷貝到另一個(gè)文件夾
這篇文章主要介紹了Java實(shí)現(xiàn)文件夾內(nèi)所有文件拷貝到另一個(gè)文件夾,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03