在使用 Spring Boot 开发过程中,处理日期和时间类型的数据是一个常见的需求。为了确保日期和时间在整个应用程序中能够一致且正确地处理,我们需要进行一些配置。在这篇博客中,我们将展示如何通过自定义配置来实现这一目标。
在 Java 中,处理日期和时间的类主要包括 LocalDateTime
、LocalDate
和 LocalTime
。这些类在不同场景下需要进行格式化或解析,例如在 JSON 序列化/反序列化、请求参数和表单数据处理等。通过自定义配置,我们可以统一这些日期和时间类型的格式,确保在整个应用程序中使用一致的格式。
我们将通过创建一个配置类 JacksonConfig
来实现日期和时间的格式化配置。该类实现了 WebMvcConfigurer
接口,并提供了两个关键方法:
jackson2ObjectMapperBuilderCustomizer
:用于配置 Jackson 的 ObjectMapper,处理 JSON 序列化和反序列化。addFormatters
:用于配置 Spring MVC 的格式化规则,处理请求参数和表单数据的解析。以下是完整的代码示例:
javapackage com.code.generator.config;
import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.annotation.Order;
import org.springframework.format.FormatterRegistry;
import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar;
import org.springframework.lang.NonNull;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
/**
* @author Jack Wei
* @date 2022/2/25 11:08
*/
@Order(-1)
@Configuration
public class JacksonConfig implements WebMvcConfigurer {
@Bean
@Primary
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> builder
.modules(new JavaTimeModule())
.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)))
.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)))
.serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)))
.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)))
.deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)))
.deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)))
.serializerByType(Long.class, ToStringSerializer.instance)
.serializerByType(Long.TYPE, ToStringSerializer.instance);
}
@Override
public void addFormatters(@NonNull FormatterRegistry registry) {
DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar();
dateTimeRegistrar.setDateFormatter(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN));
dateTimeRegistrar.setTimeFormatter(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN));
dateTimeRegistrar.setDateTimeFormatter(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN));
dateTimeRegistrar.registerFormatters(registry);
}
}
jackson2ObjectMapperBuilderCustomizer
方法这个方法配置了 Jackson 的 ObjectMapper,主要用于处理 JSON 数据的序列化和反序列化。通过该方法,我们可以设置自定义的序列化和反序列化规则:
LocalDateTimeSerializer
、LocalDateSerializer
和 LocalTimeSerializer
设置日期和时间的序列化格式,使用 LocalDateTimeDeserializer
、LocalDateDeserializer
和 LocalTimeDeserializer
设置反序列化格式。Long
类型字段序列化为字符串,避免前端处理长整型数值时出现精度丢失问题。addFormatters
方法这个方法配置了 Spring MVC 的格式化规则,主要用于处理请求参数和表单数据的解析:
DateTimeFormatterRegistrar
设置 LocalDateTime
、LocalDate
和 LocalTime
类型的格式化规则。确保在处理请求参数和表单数据时能够正确解析和格式化日期和时间。通过上述配置,我们可以确保在处理 JSON 数据和请求参数时,应用程序中的日期和时间格式一致且正确。这不仅提高了代码的可读性和维护性,还避免了由于格式不一致导致的潜在问题。
希望这篇博客对你在 Spring Boot 开发中处理日期和时间格式化有所帮助。如果你有任何问题或建议,欢迎在评论区留言讨论。