Spring Kafka配置信任所有包仍报类不在可信包错误如何解决?
问题根因
- 核心配置未生效:你在properties中配置的
JsonDeserializer.TRUSTED_PACKAGES = "*"没有生效,原因是你手动实例化了JsonDeserializer<BroMessageEvent>对象并传入DefaultKafkaConsumerFactory,此时Spring会直接使用你传入的实例,不会用properties中的配置初始化该反序列化器。 - 类型优先级问题:Spring Kafka的JsonDeserializer默认会优先读取Kafka消息Header中携带的
__TypeId__属性(生产者序列化时自动写入的目标类全限定名)作为反序列化的目标类,优先级高于你手动传入的BroMessageEvent类。生产者写入的类名为com.test.mgmt.backupandrestore.notification.Notification,因此反序列化时会尝试转为该类,而非你定义的BroMessageEvent,自然触发可信包校验报错。 - extra_data字段和该问题无关:该字段是生产者本地日志的内容,并非发往Kafka主题的消息体字段,不会影响反序列化逻辑。
解决方案
提供三种可任选的修复方案,优先推荐第一种:
方案1:强制使用指定目标类反序列化(最简便)
关闭JsonDeserializer读取消息类型头的逻辑,强制使用你指定的BroMessageEvent作为反序列化目标类,修改消费者工厂的返回逻辑即可:
return new DefaultKafkaConsumerFactory<>(props, new StringDeserializer(), // 第二个参数设为false表示不使用消息Header中的类型信息 new JsonDeserializer<>(BroMessageEvent.class, false));
方案2:手动给反序列化器设置可信包
如果你需要保留读取类型头的逻辑,手动给你创建的JsonDeserializer实例配置可信包:
JsonDeserializer<BroMessageEvent> deserializer = new JsonDeserializer<>(BroMessageEvent.class); // 手动设置可信包 deserializer.addTrustedPackages("*"); return new DefaultKafkaConsumerFactory<>(props, new StringDeserializer(), deserializer);
方案3:配置类名映射
将消息中携带的生产者类名映射到你本地的BroMessageEvent类,适合需要兼容多类型消息的场景:
首先在properties中添加类型映射配置:
props.put(JsonDeserializer.TYPE_MAPPINGS, "com.test.mgmt.backupandrestore.notification.Notification:com.ericsson.licensing.nels.server.configuration.messagebus.BroMessageEvent");
然后初始化反序列化器时加载配置:
JsonDeserializer<BroMessageEvent> deserializer = new JsonDeserializer<>(); deserializer.configure(props, false); return new DefaultKafkaConsumerFactory<>(props, new StringDeserializer(), deserializer);
额外优化建议
为了避免异常消息导致消费者持续卡死,建议配置ErrorHandlingDeserializer处理序列化异常,修改配置如下:
// 修改值反序列化器为ErrorHandlingDeserializer props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ErrorHandlingDeserializer.class); // 指定内层实际处理反序列化的类 props.put(ErrorHandlingDeserializer.VALUE_DESERIALIZER_CLASS, JsonDeserializer.class);
内容的提问来源于stack exchange,提问作者Giuseppe Percuoco
相关产品推荐
相关产品推荐

