【发布时间】:2021-10-24 20:04:27
【问题描述】:
在 Spring Boot/Spring Cloud Stream 应用程序中,我们使用 Kafka binder。我注意到在反序列化包含ZonedDateTime 属性的Kafka 消息时,即使序列化形式包含时区(例如20210101084239+0200),Jackson 也会自动更改时区(到UTC)。
经过一番研究,我发现这是一个可以禁用的默认反序列化功能,因此我在我的 @Configuration 类之一中添加了以下内容:
@Bean
public Jackson2ObjectMapperBuilderCustomizer objectMapperCustomizer() {
return builder -> {
builder.featuresToDisable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
//... other custom config...
};
但这不起作用,大概是因为 Spring Cloud Stream(或 Kafka binder)使用的 ObjectMapper 不是从应用程序上下文中配置的 Jackson2ObjectMapperBuilder 构造的:-(。
经过更多研究,我发现有人声称有必要覆盖 Spring Messaging 的 MappingJackson2MessageConverter,因为它会创建自己的 ObjectMapper。所以我添加了这个:
@Bean
public MappingJackson2MessageConverter springMessagingJacksonConverter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.getObjectMapper().configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);
return converter;
}
不幸的是,这仍然不起作用。我仍然在反序列化 ZonedDateTime 对象,忽略 JSON 值中的时区信息。
那么 Spring Cloud Stream Kafka binder 使用的 ObjectMapper 是由什么 bean 创建的,如何自定义其配置?
【问题讨论】:
标签: spring-boot jackson spring-kafka spring-cloud-stream