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
相关产品推荐
相关产品推荐

