【发布时间】:2026-02-17 07:50:01
【问题描述】:
我通过 Kafka 收到一条消息,我知道其中包含非 UTC 时区。
当我使用org.apache.kafka.common.serialization.StringDeserializer 验证这一点时,我得到了带有时区的 ISO 8601 格式的正确时间戳:
{ "id": "e499f2e8-a50e-4ff8-a9fe-0eaf9d3314bf", "sent_ts": "2021-02-04T14:06:10+01:00" }
当我切换到org.springframework.kafka.support.serializer.JsonDeserializer 时,它会丢失。我的 POJO 是这样的:
public class MyMessage {
@JsonProperty("id")
private String id;
@JsonProperty("sent_ts")
private OffsetDateTime sentTs;
@Override
public String toString() {
return "MyMessage{" +
"id='" + id + '\'' +
", sentTs=" + sentTs +
'}';
}
当我记录收到的消息时,我得到:
MyMessage{id='e499f2e8-a50e-4ff8-a9fe-0eaf9d3314bf', sentTs=2021-02-04T13:06:10Z}
我认为JsonDeserializer 必须使用Jackson,所以在我设置的application.yml 配置中:
spring.jackson:
deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE: false
这不起作用。我也试过定制器:
@Configuration
public class ObjectMapperBuilderCustomizer implements Jackson2ObjectMapperBuilderCustomizer {
@Override
public void customize(Jackson2ObjectMapperBuilder builder) {
builder.modules(new JavaTimeModule());
builder.featuresToDisable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
}
}
这也不起作用。
虽然可能它需要成为 Kafka 消费者的属性,所以我也尝试了:
spring:
consumer:
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
properties:
spring.jackson.deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE: false
还是不行。
有没有办法让JsonDeserializer 正常工作并保持正确的时区偏移?
【问题讨论】:
标签: java spring-boot jackson spring-kafka offsetdatetime