InvalidDefinitionException: невозможно создать экземпляр org.slf4j.Logger.

avatar
Heitor Santana
8 августа 2021 в 21:45
102
1
1

У меня есть кластер микросервисов akka, работающий на узлах. Я пытаюсь использовать сериализатор Джексона для конкретных сообщений приложения, которыми обмениваются узлы (микросервисы). Мой код написан на scala, а не на Java

Я использую 'класс case' scala, так как сообщения akka, которыми обмениваются акторы, и каждое сообщение (класс case) имеет встроенный val LOG:org.slf4j.Logger для регистрации информации об обработке конкретной бизнес-логики.

Когда я отправляю сообщения между узлами, я получаю исключение

ПРЕДУПРЕЖДЕНИЕ akka.remote.artery.Deserializer — не удалось десериализовать сообщение от [akka://MyCluster@127.0.0.1:25251] с идентификатором сериализатора [33] и манифестом [com...MyCaseClassMessage]. com.fasterxml.jackson.databind.exc.InvalidDefinitionException: невозможно создать экземпляр org.slf4j.Logger (не существует создателей, таких как конструктор по умолчанию): абстрактные типы либо должны быть сопоставлены с конкретными типами, иметь настраиваемый десериализатор или содержать дополнительную информацию о типе at [Источник: ..."[усечено 'n' байт]; строка: 'n', столбец: 'n'] (через цепочку ссылок : com...MyCaseClassMessage["LOG"])

Мой класс case выглядит примерно так:

case class MyCaseClassMessage()
  extends CborSerializable {

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

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

}

Я понятия не имею, как указать Джексону, как сериализовать и (или) десериализовать "val LOG:Logger" в моем классе case. Я просто знаю, что если я удалю свой Logger, заменив его (например) println("message"), у меня не будет проблем с сериализацией и десериализацией.

Любая помощь?

Источник

Ответы (1)

avatar
Levi Ramsey
8 августа 2021 в 22:34
2

Поскольку Джексон полагается на отражение и не понимает соглашения в классах case Scala, согласно которому для определения сообщения требуются только параметры конструктора, он попытается сериализовать каждое поле объекта.

Поле LOG может быть проигнорировано Джексоном путем добавления к нему аннотации @JsonIgnore (com.fasterxml.jackson.annotation.JsonIgnore):

@JsonIgnore
override val LOG: Logger = LoggerFactory.getLogger(classOf[MyCaseClassMessage])
Heitor Santana
11 августа 2021 в 14:39
0

Это было именно так! Спасибо!