Spring 启动休息 - OffsetDateTime 返回为浮点数
Spring Boot Rest - OffsetDateTime Returned as Float
我有一个 Spring 引导应用程序 (2.4.1),其中 OffsetDateTime
字段作为浮点值从 RestController
返回。示例:
"created_at": 1616080724.531610100
我尝试了 中所有建议的解决方案。 None 其中对我有用。
我还尝试添加一个非常简单的端点,只有 returns OffsetDateTime
:
@GetMapping("/test")
public OffsetDateTime test() {
return OffsetDateTime.now();
}
结果相同,返回的是浮点值。
然后我在最小 Spring 引导项目中尝试了相同的终点,它按预期以 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 上测试)。这可能是什么问题?
在 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"
configureMessageConverters
的解决方案正是我所需要的。我有同样的问题,你真的帮助了我。谢谢!
也许你应该将解决方案报告给Spring
我有一个 Spring 引导应用程序 (2.4.1),其中 OffsetDateTime
字段作为浮点值从 RestController
返回。示例:
"created_at": 1616080724.531610100
我尝试了
我还尝试添加一个非常简单的端点,只有 returns OffsetDateTime
:
@GetMapping("/test")
public OffsetDateTime test() {
return OffsetDateTime.now();
}
结果相同,返回的是浮点值。
然后我在最小 Spring 引导项目中尝试了相同的终点,它按预期以 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 上测试)。这可能是什么问题?
在 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"
configureMessageConverters
的解决方案正是我所需要的。我有同样的问题,你真的帮助了我。谢谢!
也许你应该将解决方案报告给Spring