【发布时间】:2021-07-21 15:23:57
【问题描述】:
我在将自定义 ObjectMapper 注入 Spring Kafka 序列化程序时遇到了问题,我已经用这个 answer 解决了这个问题,LocalDateTime 正在以正确的模式序列化。
@Configuration
public class KafkaCustomizer implements DefaultKafkaProducerFactoryCustomizer {
@Bean
public ObjectMapper objectMapper() {
var mapper = new ObjectMapper();
var module = new JavaTimeModule();
var serializer = new LocalDateTimeSerializer(
DateTimeFormatter.ofPattern(DateConstants.DATETIME_FORMAT_PATTERN));
module.addSerializer(LocalDateTime.class, serializer);
mapper.registerModule(module);
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return mapper;
}
@Override
public void customize(DefaultKafkaProducerFactory<?, ?> producerFactory) {
producerFactory.setValueSerializer(new JsonSerializer<>(objectMapper()));
}
}
但现在我面临另一个问题,spring.kafka.producer.properties.spring.json.type.mapping 属性被忽略了。
我的记录的__TypeId__ 标头是用FQCN 设置的,而不是我在spring.json.type.mapping 属性中放入的令牌:foo > com.foo.package.Foo
当我进行调试时,似乎没有调用 org.springframework.kafka.support.serializer.JsonSerializer 类的 configure 方法:
@Override
public void configure(Map<String, ?> configs, boolean isKey) {
...
if (configs.containsKey(TYPE_MAPPINGS) && !this.typeMapperExplicitlySet
&& this.typeMapper instanceof AbstractJavaTypeMapper) {
((AbstractJavaTypeMapper) this.typeMapper)
.setIdClassMapping(createMappings((String) configs.get(TYPE_MAPPINGS)));
}
}
但是当我禁用自定义时
@Override
public void customize(DefaultKafkaProducerFactory<?, ?> producerFactory) {
// producerFactory.setValueSerializer(new JsonSerializer<>(objectMapper()));
}
然后__TypeId__ 标头设置了正确的标记但正如预期的那样,我使用自定义ObjectMapper 放松了日期格式
那么如何处理这整个情况呢?
【问题讨论】:
标签: spring jackson spring-kafka