如何禁用Spring Kafka的__TypeId__与spring_json_header_types魔术头
问题分析与解决方案
你当前使用ByteArrayJsonMessageConverter时,__TypeId__头是由该转换器内部的Jackson2JavaTypeMapper自动添加的——你配置的JsonSerializer.ADD_TYPE_INFO_HEADERS参数只对Spring的JsonSerializer生效,和当前使用的ByteArraySerializer无关,所以自然不起作用。
要同时禁用__TypeId__和spring_json_header_types这两个魔术头,只需修改ByteArrayJsonMessageConverter的类型映射配置,结合你已有的SimpleKafkaHeaderMapper即可实现。
修改后的配置代码
@TestConfiguration public static class TestKafkaProducerConfig { @Bean public KafkaTemplate<String, MyEvent> kafkaTemplate( @Value("${kafka.consumer.my-topic-name}") String topicName, EmbeddedKafkaBroker embeddedKafka) { var template = new KafkaTemplate<>(producerFactory(embeddedKafka)); template.setDefaultTopic(topicName); // 配置HeaderMapper,避免spring_json_header_types头 var headerMapper = new SimpleKafkaHeaderMapper(); headerMapper.setMapAllStringsOut(true); // 配置ByteArrayJsonMessageConverter,禁用__TypeId__头 var messageConverter = new ByteArrayJsonMessageConverter(); messageConverter.setHeaderMapper(headerMapper); // 创建类型映射器并禁用类型信息头 DefaultJackson2JavaTypeMapper typeMapper = new DefaultJackson2JavaTypeMapper(); typeMapper.setAddTypeInfoHeaders(false); messageConverter.setTypeMapper(typeMapper); template.setMessageConverter(messageConverter); return template; } @Bean public ProducerFactory<String, MyEvent> producerFactory(EmbeddedKafkaBroker embeddedKafka) { return new DefaultKafkaProducerFactory<>(producerConfig(embeddedKafka)); } public Map<String, Object> producerConfig(EmbeddedKafkaBroker embeddedKafka) { Map<String, Object> props = KafkaTestUtils.producerProps(embeddedKafka); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class); // 该参数对ByteArraySerializer无效,可移除 // props.put(JsonSerializer.ADD_TYPE_INFO_HEADERS, false); return props; } }
关键说明
ByteArrayJsonMessageConverter默认依赖DefaultJackson2JavaTypeMapper处理类型信息,通过setAddTypeInfoHeaders(false)可直接禁用__TypeId__头的生成。- 你已配置的
SimpleKafkaHeaderMapper会自动避免生成spring_json_header_types头,无需额外调整。 - 原配置中
JsonSerializer.ADD_TYPE_INFO_HEADERS参数可移除,因为它仅对Spring的JsonSerializer生效,当前场景下无意义。
内容的提问来源于stack exchange,提问作者dmitryb
相关产品推荐
相关产品推荐

