You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:05:19