Java8中對于LocalDateTime的序列化和反序列化問題
Java8對于LocalDateTime的序列化和反序列化
這里以jackjson為例
配置反序列化工具
/**
* 時間戳反序列化時間
*
* @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ù)據(jù)序列化
? ? ? ? ? ? builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
? ? ? ? ? ? //接收時間數(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時間類序列化和反序列化的支持
由于項(xiàng)目將原有的 Date類型的字段改造為 LocalDate,LocalDateTime,LocalTime 類型, 發(fā)現(xiàn) spring 對項(xiàng)目的時間格式無法自動轉(zhuǎn)換,故需手動配置下。
在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)日期時間格式 */
? ? 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)時間格式 */
? ? public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
}然后只需要在實(shí)體類中對應(yīng)的時間類型上使用 @DateTimeFormat 和 @JsonFormat 即可。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解基于IDEA2020.1的JAVA代碼提示插件開發(fā)例子
這篇文章主要介紹了詳解基于IDEA2020.1的JAVA代碼提示插件開發(fā)例子,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)
這篇文章主要介紹了SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java ArrayList如何實(shí)現(xiàn)生成不重復(fù)隨機(jī)數(shù)
這篇文章主要介紹了Java ArrayList如何實(shí)現(xiàn)生成不重復(fù)隨機(jī)數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
java 交換兩個數(shù)據(jù)的方法實(shí)例詳解
這篇文章主要介紹了java 交換兩個數(shù)據(jù)的方法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12
Spring Security實(shí)現(xiàn)禁止用戶重復(fù)登陸的配置原理
這篇文章主要介紹了Spring Security實(shí)現(xiàn)禁止用戶重復(fù)登陸的配置原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
Java中comparator接口和Comparable接口的比較解析
這篇文章主要介紹了Java中comparator接口和Comparable接口的比較解析,Java提供了一個用于比較的接口Comparator和Comparable接口,提供了一個比較的方法,所有實(shí)現(xiàn)該接口的類,都動態(tài)的實(shí)現(xiàn)了該比較方法,需要的朋友可以參考下2023-08-08
Spring中的攔截器HandlerInterceptor詳細(xì)解析
這篇文章主要介紹了Spring中的攔截器HandlerInterceptor詳細(xì)解析,HandlerInterceptor 是 Spring 框架提供的一個攔截器接口,用于在請求處理過程中攔截和處理請求,需要的朋友可以參考下2024-01-01
基于線程的wait和notify使用,生產(chǎn)消費(fèi)案例
這篇文章主要介紹了基于線程的wait和notify使用,生產(chǎn)消費(fèi)案例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

