Spring Boot Java8 LocalDateTime日期序列化与反序列化 解决方案

网上绝大多数的解决方案都是没有用的!不要浪费时间!!!

使用场景

一)、DTO含有LocalDateTime字段时,可以将日期格式化,传输出去

二)、当后端实体对象的LocalDateTime字段需要接收前端传来的日期字符串,如2019-12-01,可以反序列化给日期字段


LocalDateTime 反序列化器

不需要另外引入什么jsr310依赖,spring-boot-starter-web里面就包含有

<dependency>
    <groupId>com.fasterxml.jackson.datatypegroupId>
    <artifactId>jackson-datatype-jsr310artifactId>
    <version>2.9.10version>
    <scope>compilescope>
dependency>

<dependency>
    <groupId>cn.hutoolgroupId>
    <artifactId>hutool-coreartifactId>
    <version>4.5.2version>
dependency>
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

/**
 * LocalDateTime 反序列化器
 * 

* 说明: * 1. 借用hutool相关工具类 * * @author MoCha * @date 2019/11/30 */ public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> { @Override public LocalDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { String dateStr = parser.getText(); DateTime dateTime; try { dateTime = DateUtil.parse(dateStr); } catch (Exception e) { dateTime = DateUtil.parseDateTime(dateStr.replaceAll("T", " ")); } Date date = dateTime.toJdkDate(); Instant instant = date.toInstant(); ZoneId zoneId = ZoneId.systemDefault(); return instant.atZone(zoneId).toLocalDateTime(); } @Override public Class<?> handledType() { // 关键 return LocalDateTime.class; } }

LocalDateTime 日期适配器

import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * LocalDateTime 日期适配器
 *
 * @author MoCha
 * @date 2019/11/30
 */
@Configuration
public class LocalDateTimeConvertConfig {
    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
    private String pattern;

    /**
     * 配置LocalDateTime 序列化器与反序列化器
     * 

* 说明: * 1. 下面配置的new LocalDateTimeDeserializer()为我们定制的LocalDateTime反序列化器 */ @Bean public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { return builder -> { builder.serializerByType(LocalDateTime.class, localDateTimeSerializer()); builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer()); }; } /** * LocalDateTime 序列化器 */ @Bean public LocalDateTimeSerializer localDateTimeSerializer() { return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern)); } }

你可能感兴趣的:(Spring,Boot,Java进化之旅,jackson,java8,Spring,Boot,LocalDateTime,序列化反序列化)