You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何格式化持久化到MySQL BLOB的POJO中LocalDateTime字段

解决BLOB存储POJO中LocalDateTime序列化格式问题

首先得明确两个关键点:你用的@DateTimeFormat是给Spring MVC做请求参数/视图层格式化用的,对Jackson序列化JSON完全不起作用;而@JsonFormat之所以没生效,大概率是因为缺少Java 8时间类型的Jackson模块支持,或者注解参数没配置对。

下面是具体的解决步骤:

1. 确保依赖Jackson Java 8时间模块

Jackson默认不支持Java 8的LocalDateTime、LocalDate等新时间类型,必须引入jackson-datatype-jsr310模块。如果是Maven项目,加入依赖:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

Spring Boot项目不用手动加,因为spring-boot-starter-web已经包含了这个依赖。

2. 修正POJO的注解配置

去掉没用的@DateTimeFormat,给LocalDateTime字段配置正确的@JsonFormat:

public class MyPOJO {
    private Long id;
    
    @JsonFormat(
        pattern = "yyyy-MM-dd HH:mm:ss",
        shape = JsonFormat.Shape.STRING
        // 可选:如果需要指定时区可以加timezone = "GMT+8",LocalDateTime本身无时区,序列化时按需调整
    )
    private LocalDateTime dateTime;
    
    private String someText;
    
    // 构造方法、getter/setter
}

这里核心是shape = JsonFormat.Shape.STRING,强制Jackson把时间类型序列化为字符串,而不是默认的嵌套对象结构。另外注意HH是24小时制,hh是12小时制,根据你的实际需求调整格式。

3. 全局配置(可选:统一所有时间类型序列化规则)

如果不想每个字段都加注解,可以在Spring Boot里全局配置Jackson:

方式1:通过application.yml配置

spring:
  jackson:
    serialization:
      write-dates-as-timestamps: false
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    modules:
      - com.fasterxml.jackson.datatype.jsr310.JavaTimeModule

方式2:通过配置类自定义

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        JavaTimeModule module = new JavaTimeModule();
        // 配置LocalDateTime的序列化/反序列化格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
        module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
        mapper.registerModule(module);
        // 关闭默认的时间戳序列化方式
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        return mapper;
    }
}

验证效果

配置完成后,你的POJO序列化后的JSON应该变成:

{ 
  "id" : 1, 
  "dateTime" : "2010-01-01 02:02:00", 
  "someText": "someText" 
}

原理补充

Jackson对Java 8时间类型的默认处理是序列化为嵌套对象结构,只有通过JavaTimeModule模块指定序列化器,或者用@JsonFormat强制指定shape=STRING,才能输出你想要的字符串格式。而@DateTimeFormat是Spring MVC专属注解,和Jackson序列化BLOB中的POJO完全无关,所以之前的配置等于没起作用。

内容的提问来源于stack exchange,提问作者Space Cadet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:28:11