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

Spring Boot中OpenAPI date-time与@DateTimeFormat返回格式异常问题

解决Spring Boot中OffsetDateTime字段响应返回ISO格式字符串的问题

问题原因

@DateTimeFormat注解仅用于请求参数的解析(比如URL参数、表单参数),而响应JSON的序列化由Jackson处理。默认情况下,Jackson会将OffsetDateTime类型序列化为时间戳,导致返回格式不符合预期。

解决方案

方案1:字段级注解(局部配置)

在EmployeeDTO的lastCommunicated字段上添加Jackson的@JsonFormat注解,指定序列化格式为ISO 8601字符串:

private Long id;
  
private String name;

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) // 处理请求参数解析
@JsonFormat(shape = JsonFormat.Shape.STRING, iso = JsonFormat.ISO.DATE_TIME) // 处理响应序列化
private OffsetDateTime lastCommunicated;

方案2:全局配置(所有日期时间类型统一处理)

如果希望项目中所有OffsetDateTime、LocalDateTime等Java 8时间类型都返回ISO格式字符串,可以通过以下两种方式配置:

方式1:配置文件(application.yml)

spring:
  jackson:
    serialization:
      write-dates-as-timestamps: false # 禁用时间戳序列化
    deserialization:
      adjust-dates-to-context-time-zone: false # 保留原时区信息
    modules:
      - com.fasterxml.jackson.datatype.jsr310.JavaTimeModule # 注册Java 8时间模块

方式2:Java配置类

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonDateTimeConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        // 禁用将日期序列化为时间戳
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        // 注册Java 8时间模块,支持OffsetDateTime等类型的序列化/反序列化
        objectMapper.registerModule(new JavaTimeModule());
        return objectMapper;
    }
}

验证效果

配置完成后,重新请求接口,响应中的lastCommunicated字段将返回:

{
 "id": 1,
 "name": "test",
 "lastCommunicated": "2021-08-31T01:03:34Z"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:57:31