Spring-Scala遗留项目如何禁用Spring-Kafka JsonDeserializer可信包检查?
解决Spring自动添加可信包导致无法禁用类型检查的问题
我之前维护遗留Spring项目时也碰到过一模一样的坑——Spring会默认把java.util、java.lang这类基础包塞进可信列表,导致我们没法靠设置空列表来跳过类型检查。结合Spring-Scala的场景,给你几个实用的解决方案:
方案1:自定义反序列化器,直接绕过检查逻辑
如果你的消费者用的是Spring自带的JsonDeserializer(比如Kafka或AMQP的消息反序列化场景),最稳妥的方式是继承它并重写检查方法:
class UncheckedJsonDeserializer[T](targetType: Class[T]) extends JsonDeserializer[T](targetType) { // 重写检查方法,什么都不做直接跳过 override def checkTrustedPackage(typeName: String): Unit = {} }
然后在配置消费者工厂时替换掉默认的反序列化器:
@Bean def kafkaConsumerFactory(): ConsumerFactory[String, YourNewEventType] = { val configs = new java.util.HashMap[String, AnyRef]() // 配置你的bootstrap servers、group id等参数... val eventDeserializer = new UncheckedJsonDeserializer(classOf[YourNewEventType]) new DefaultKafkaConsumerFactory(configs, new StringDeserializer(), eventDeserializer) }
方案2:用反射清空Spring默认可信包(临时救急首选)
如果不想改动太多业务代码,可以用反射强行清空Spring自动注入的默认可信包列表,在配置类里加个初始化方法:
@PostConstruct def clearDefaultTrustedPackages(): Unit = { val deserializerClass = classOf[JsonDeserializer[_]] val defaultPackagesField = deserializerClass.getDeclaredField("DEFAULT_TRUSTED_PACKAGES") defaultPackagesField.setAccessible(true) // 替换成空集合,让你的代码逻辑触发跳过检查的分支 defaultPackagesField.set(null, java.util.Collections.emptySet[String]()) }
⚠️ 注意:这种方法依赖Spring内部字段名,后续框架升级可能失效,适合遗留项目快速修复。
方案3:修改自定义检查逻辑的触发条件(如果有权限改)
如果检查逻辑是你们自己写的(不是Spring框架代码),可以把“列表为空才跳过检查”的条件放宽——比如添加一个特殊标记(比如"*")来表示跳过:
// 原来的判断逻辑 if (trustedPackages.isEmpty) { // 跳过检查 } else { // 执行包校验 } // 修改后的逻辑 if (trustedPackages.isEmpty || trustedPackages.contains("*")) { // 跳过检查 } else { // 执行包校验 }
之后在配置里把可信包设置为List("*"),既绕开了Spring的默认包,又能触发跳过检查的分支。
内容的提问来源于stack exchange,提问作者bottaio
相关产品推荐
相关产品推荐

