InvalidDefinitionException:无法构造 `org.slf4j.Logger` 的实例

InvalidDefinitionException: Cannot construct instance of `org.slf4j.Logger`

我在节点上有一个 akka 微服务集群 运行。我正在尝试将 Jackson 序列化程序用于节点(微服务)之间交换的应用程序特定消息。 我的代码是用scala写的,不是Java

我正在使用 scala 'case class' 作为演员之间交换的 akka 消息,每条消息(案例 class)都有一个 val LOG:org.slf4j.Logger 内置记录具体业务逻辑处理信息。

当我在节点之间发送消息时出现异常

WARN akka.remote.artery.Deserializer - 无法反序列化来自 [akka://MyCluster@127.0.0.1:25251] 且序列化器 ID [33] 和清单 [com...MyCaseClassMessage] 的消息。 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 无法构造 org.slf4j.Logger 的实例(不存在像默认构造函数这样的创建者):抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么包含额外的类型信息 在 [来源:...[截断 'n' 字节];行:'n' ,列:'n'](通过引用链:com...MyCaseClassMessage["LOG"])

我的情况 class 本质上是这样的:

case class MyCaseClassMessage()
  extends CborSerializable {

  override val LOG:Logger = LoggerFactory.getLogger(classOf[MyCaseClassMessage])

  val businessLogic:Array[Byte] = ...
  def apply():Array[Byte] = ...

}

我不知道如何向 Jackson 指定如何序列化和(或)反序列化我的例子中的“val LOG:Logger”class。我只知道如果我删除我的 Logger,将其替换为(例如)println("message"),我对序列化和反序列化没有任何问题。

有什么帮助吗?

因为Jackson依赖于反射,不理解Scala case中的惯例类定义消息只需要构造函数参数,它会尝试序列化对象的每个字段。

Jackson 可以忽略 LOG 字段,方法是使用 @JsonIgnore 注释 (com.fasterxml.jackson.annotation.JsonIgnore):

@JsonIgnore
override val LOG: Logger = LoggerFactory.getLogger(classOf[MyCaseClassMessage])