Spring Boot Rest - OffsetDateTime 作为浮点数返回

Posted

技术标签:

【中文标题】Spring Boot Rest - OffsetDateTime 作为浮点数返回【英文标题】:Spring Boot Rest - OffsetDateTime Returned as Float 【发布时间】:2021-06-16 01:11:18 【问题描述】:

我有一个 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
...

但它最终仍然会在客户端浮动(在浏览器和 Postman 上进行测试)。这可能是什么问题?

【问题讨论】:

【参考方案1】:

configureMessageConverters 的解决方案正是我所需要的。我有同样的问题,你真的帮助了我。谢谢!

也许你应该向 Spring 报告解决方案

【讨论】:

【参考方案2】:

在 Jackson 类中进行了一些调试后,我发现 InstantSerializerBase#serialize 方法正在使用默认的 SerializerProvider (DefaultSerializerProviderImpl) 调用,它启用了 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"

【讨论】:

以上是关于Spring Boot Rest - OffsetDateTime 作为浮点数返回的主要内容,如果未能解决你的问题,请参考以下文章

列出所有已部署的 REST 端点(spring-boot、tomcat)

初入spring boot(八 )Spring Data REST

Spring Boot测试中使用REST Assured(转)

spring boot开发REST接口

Spring Boot 2 Rest Api Example

如何在 Spring(Boot)中装饰 REST 响应?