【问题标题】:InvalidDefinitionException: Cannot construct instance of `org.slf4j.Logger`InvalidDefinitionException:无法构造“org.slf4j.Logger”的实例
【发布时间】:2021-08-08 21:45:28
【问题描述】:

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

我使用 scala 'case class' 作为参与者之间交换的 akka 消息,并且每个消息(案例类)都有一个内置的 val LOG:org.slf4j.Logger 来记录特定的业务逻辑处理信息。

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

警告 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"])

我的案例类基本上是这样的:

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”。我只知道如果我删除我的 Logger,将其替换为(例如) println("message") 我对序列化和反序列化没有任何问题。

有什么帮助吗?

【问题讨论】:

    标签: scala jackson deserialization slf4j akka-cluster


    【解决方案1】:

    因为 Jackson 依赖反射并且不理解 Scala 案例类中定义消息时只需要构造函数参数的约定,因此它将尝试序列化对象的每个字段。

    Jackson 可以通过使用 @JsonIgnore 注释 (com.fasterxml.jackson.annotation.JsonIgnore) 注释来忽略 LOG 字段:

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

    【讨论】:

    • 就是这样!谢谢!
    猜你喜欢
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 2021-07-17
    • 2014-08-28
    • 2020-09-27
    • 2020-03-08
    • 2020-05-07
    相关资源
    最近更新 更多