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í)體類(lèi)使用注解
@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í)間類(lèi)序列化和反序列化的支持
由于項(xiàng)目將原有的 Date類(lèi)型的字段改造為 LocalDate,LocalDateTime,LocalTime 類(lèi)型, 發(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í)體類(lèi)中對(duì)應(yīng)的時(shí)間類(lèi)型上使用 @DateTimeFormat 和 @JsonFormat 即可。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
linux配置jdk環(huán)境變量簡(jiǎn)單教程
這篇文章主要為大家詳細(xì)介紹了linux配置jdk環(huán)境變量簡(jiǎn)單教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
詳解基于IDEA2020.1的JAVA代碼提示插件開(kāi)發(fā)例子
這篇文章主要介紹了詳解基于IDEA2020.1的JAVA代碼提示插件開(kāi)發(fā)例子,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)
這篇文章主要介紹了SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java ArrayList如何實(shí)現(xiàn)生成不重復(fù)隨機(jī)數(shù)
這篇文章主要介紹了Java ArrayList如何實(shí)現(xiàn)生成不重復(fù)隨機(jī)數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Quarkus云原生開(kāi)篇java框架簡(jiǎn)介
Quarkus?是小紅帽開(kāi)源的專門(mén)針對(duì)云容器環(huán)境優(yōu)化的云原生java框架,博主接下來(lái)的項(xiàng)目估計(jì)都會(huì)使用這個(gè)框架來(lái)開(kāi)發(fā),相關(guān)的問(wèn)題都會(huì)記錄在這個(gè)系列,本文是個(gè)開(kāi)篇2022-02-02
java 交換兩個(gè)數(shù)據(jù)的方法實(shí)例詳解
這篇文章主要介紹了java 交換兩個(gè)數(shù)據(jù)的方法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12
Spring Security實(shí)現(xiàn)禁止用戶重復(fù)登陸的配置原理
這篇文章主要介紹了Spring Security實(shí)現(xiàn)禁止用戶重復(fù)登陸的配置原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Java中comparator接口和Comparable接口的比較解析
這篇文章主要介紹了Java中comparator接口和Comparable接口的比較解析,Java提供了一個(gè)用于比較的接口Comparator和Comparable接口,提供了一個(gè)比較的方法,所有實(shí)現(xiàn)該接口的類(lèi),都動(dòng)態(tài)的實(shí)現(xiàn)了該比較方法,需要的朋友可以參考下2023-08-08
Spring中的攔截器HandlerInterceptor詳細(xì)解析
這篇文章主要介紹了Spring中的攔截器HandlerInterceptor詳細(xì)解析,HandlerInterceptor 是 Spring 框架提供的一個(gè)攔截器接口,用于在請(qǐng)求處理過(guò)程中攔截和處理請(qǐng)求,需要的朋友可以參考下2024-01-01
基于線程的wait和notify使用,生產(chǎn)消費(fèi)案例
這篇文章主要介紹了基于線程的wait和notify使用,生產(chǎn)消費(fèi)案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

