json - Spring Boot Rest - OffsetDateTime 以浮点形式返回

标签 json spring-boot rest serialization jackson

我有一个 Spring Boot 应用程序 (2.4.1),其中 OffsetDateTime 字段从 RestController 以浮点值形式返回。示例:

"created_at": 1616080724.531610100

我尝试了 this thread 中所有建议的解决方案。他们都不适合我。

我还尝试添加一个非常简单的端点,仅返回 OffsetDateTime:

@GetMapping("/test")
public OffsetDateTime test() {
    return OffsetDateTime.now();
}

结果是相同的,它以浮点值形式返回。

然后我在一个最小的 Spring Boot 项目中尝试了相同的端点,它按预期以 ISO 格式返回:

"2021-03-18T15:39:14.5295632+01:00"

这一切都表明某些传递依赖关系与 Sprint Boot 使用的默认 Jackson 序列化程序相混淆。但是 mvn dependency:tree 没有给我任何可疑的依赖项(例如没有 gson marshaller 依赖项)。

我还尝试启用 TRACE 日志记录,我可以看到用 HttpEntityMethodProcessor 编写的对象具有正确格式的 created_at 时间:

TRACE org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor - Writing [class MyObject {
....
createdAt: 2021-03-18T16:37:34.113316500+01:00
...

但它最终仍然在客户端作为 float (在浏览器和 Postman 上进行测试)。这里可能出现什么问题?

最佳答案

在 Jackson 类中进行一些调试后,我发现使用默认的 SerializerProvider (DefaultSerializerProviderImpl) 调用 InstantSerializerBase#serialize 方法,其中启用了 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 功能。这导致 OffsetDateTime 值序列化为纪元秒 + 纳秒。

我能够通过调整我们的 WebMvcConfigurer 实现来解决该问题,如下所示:

@Configuration
@EnableWebMvc
public class WebConfiguration implements WebMvcConfigurer {

    // Some other configuration

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MappingJackson2HttpMessageConverter(objectMapper()));
    }

    private ObjectMapper objectMapper() {
        return new ObjectMapper()
            .disable(WRITE_DATES_AS_TIMESTAMPS)
            .registerModule(new JavaTimeModule());
    }
}

经过此更改,OffsetDateTime 字段最终以 ISO 格式序列化;例如

"created_at": "2021-03-19T17:05:27.785646+01:00"

关于json - Spring Boot Rest - OffsetDateTime 以浮点形式返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66694406/

相关文章:

javascript - 如何在 javascript 中添加新的 json 节点

javascript - 从 JSON 文件获取 jPlayer 播放列表的信息

java - 模拟休息服务服务器 : how to mock a POST call with a body?

rest - 如何从Github API获取JSON?

windows - 如何使用 REST+cURL 更新 TeamCity 构建参数

java - 如何使用Java从json文件中提取每个元素(书签)作为一个项目?

javascript - Json 请求在 javascript 中有效,但在 php 中无效

Spring Cloud Gateway 无法负载平衡并给出错误 500

spring - Spring Boot自定义连接对象

c# - 来自 API 的 ResponseStream 导致反序列化时出现空值