akka.persistence.typed.internal.JournalFailureException: исключение при восстановлении. Как это решить? - PullRequest
0 голосов
/ 19 марта 2020

Используя постоянство Akka, я получаю следующее исключение:

Причина: akka.persistence.typed.internal.JournalFailureException: исключение при восстановлении. Последний известный порядковый номер [0]. PersistenceId [PersistenceExample], из-за: Невозможно создать экземпляр com.exercisePersistence.simpleExample.MyPersistentBehavior$Added (хотя существует по крайней мере один Создатель): невозможно десериализовать из значения объекта (без создателя на основе делегатов или свойств) в [Source: (byte []) "{ "данные": "data1"} "; строка: 1, столбец: 2] в akka.persistence.typed.internal.ReplayingEvents.onRecoveryFailure (ReplayingEvents. scala: 221) в akka.persistence.typed.internal.ReplayingEvents.onJournalResponse (ReplayingEvents. scala 143): ... 26 общих кадров опущено

Причина: com.faster xml .jackson.databind.ex c .MismatchedInputException: Невозможно создать экземпляр com.exercisePersistence.simpleExample.MyPersistentBehavior$Added (хотя существует хотя бы один создатель): невозможно десериализовать из значения объекта (без создателя на основе делегатов или свойств) в [Source: (byte []) "{" data ":" data1 "}"; строка: 1, столбец: 2]

Добавленный класс, который дает мне исключение:

public class MyPersistentBehavior 
    extends EventSourcedBehavior<MyPersistentBehavior.Command, 
        MyPersistentBehavior.Event, MyPersistentBehavior.State> {

    // COMMAND
    interface Command {}
    public static class Add implements Command {
      public final String data;

      public Add(String data) {
        this.data = data;
      }
    }
...
}

Файл reference.conf

akka {
 actor {
serializers {
  jackson-json = "akka.serialization.jackson.JacksonJsonSerializer"
  jackson-cbor = "akka.serialization.jackson.JacksonCborSerializer"
  proto = "akka.remote.serialization.ProtobufSerializer"
}
serialization-bindings {
  "com.exercisePersistence.simpleExample.MyPersistentBehavior" = jackson-json
  "com.exercisePersistence.simpleExample.MyPersistentBehavior$Added" = jackson-json
  #"docs.serialization.CborSerializable" = jackson-cbor
  "com.google.protobuf.Message" = proto
}

}

akka.serialization.jackson {
      jackson-json-message {
        serialization-features {
          WRITE_DATES_AS_TIMESTAMPS = on
        }
      }
      jackson-json-event {
        serialization-features {
          WRITE_DATES_AS_TIMESTAMPS = off
        }
      }
  }
  persistence {
    journal {
      plugin = "leveldb"

      leveldb {
        dir = "target/persistence/journal"
      }
    }

    snapshot-store.local.dir = "target/persistence/snapshots"
  }
}

leveldb {
  dir = "target/persistence/journal"
  checksum: "off"
  class: "akka.persistence.journal.leveldb.LeveldbJournal"
  dir: "target/persistence/journal"
  fsync: "on"
  native: "on"
  plugin-dispatcher : "akka.persistence.dispatchers.default-plugin-dispatcher"
  replay-dispatcher : "akka.persistence.dispatchers.default-replay-dispatcher"
}

Если вы хотите клонировать проект, это ссылка на Github: https://github.com/Mazzotta13/AkkaTutorial.git

1 Ответ

0 голосов
/ 29 апреля 2020

У вас есть пара различных опций:

  1. Поскольку вы сериализуетесь с Джексоном, вы можете добавить аннотацию @JsonCreator к своему конструктору в объектах протокола.
  2. Вы можете использовать Lombak для создания объектов вашего протокола, которые экономят на большом количестве таблички java и комментируют ее @NoArgsConstructor.
  3. Создать пустой конструктор.

Некоторую информацию об этом можно найти здесь, https://doc.akka.io/docs/akka/current/serialization-jackson.html#annotations

...