Springboot 接收&返回 LocalDateTime 全自动时间戳互转

前言

从Java 8开始,LocalDateTime作为一种更高效的日期时间处理类被引入,用以替代旧版的Date。然而,在Spring Boot项目中,默认情况下前端传入和返回LocalDateTime的格式可能不符合期望(例如:期望为毫秒级时间戳)。因此,需要配置自定义的序列化器和反序列化器来满足需求。

注意事项

  • JavaScript中的Number类型整数取值范围是±2^53 - 1,而Java中的Long类型可以安全地表示更大的数值(64位),因此推荐在Java端使用LongString来接收和返回数据,以避免精度丢失问题。

解决方案

为了使Spring Boot应用能够正确地将LocalDateTime与毫秒级时间戳相互转换,可以通过自定义Jackson的序列化器和反序列化器来实现。以下是具体的实现代码:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

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

@Configuration
public class LocalDateTimeConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> {
            // 创建一个用于序列化和反序列化的DateTimeFormatter
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

            // 添加自定义的LocalDateTime序列化器和反序列化器
            JavaTimeModule javaTimeModule = new JavaTimeModule();
            javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
            javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));

            // 将JavaTimeModule添加到ObjectMapper中
            builder.modules(javaTimeModule);
        };
    }
}
Comments: 1

「人生在世,留句话给我吧」

提交评论