Ege*_*men 2 rest serialization json jackson spring-boot
我有一个 Spring Boot 应用程序 (2.4.1),其中一个OffsetDateTime字段作为浮点值从RestController. 例子:
"created_at": 1616080724.531610100
Run Code Online (Sandbox Code Playgroud)
我尝试了该线程中所有建议的解决方案。他们都不为我工作。
我还尝试添加一个非常简单的端点,仅返回OffsetDateTime:
@GetMapping("/test")
public OffsetDateTime test() {
return OffsetDateTime.now();
}
Run Code Online (Sandbox Code Playgroud)
结果是相同的,它以浮点值形式返回。
然后我在一个最小的 Spring Boot 项目中尝试了相同的端点,它按预期以 ISO 格式返回:
"2021-03-18T15:39:14.5295632+01:00"
Run Code Online (Sandbox Code Playgroud)
这一切都表明某些传递依赖关系与 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
...
Run Code Online (Sandbox Code Playgroud)
但它最终仍然在客户端作为浮动(在浏览器和 Postman 上进行测试)。这里可能有什么问题?
在 Jackson 类中进行一些调试后,我发现该方法是使用默认值( )InstantSerializerBase#serialize调用的,该方法启用了该功能。这导致将值序列化为纪元秒 + 纳秒。SerializerProviderDefaultSerializerProviderImplSerializationFeature.WRITE_DATES_AS_TIMESTAMPSOffsetDateTime
我能够通过调整我们的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());
}
}
Run Code Online (Sandbox Code Playgroud)
经过此更改,OffsetDateTime字段最终以 ISO 格式序列化;例如
"created_at": "2021-03-19T17:05:27.785646+01:00"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1134 次 |
| 最近记录: |