Невозможно десериализовать кэшированные данные JSON в AsyncResult. - PullRequest
0 голосов
/ 10 мая 2019

Я использую Spring кеш с реализацией Redis, у меня есть следующий метод

@Async
@Cacheable(key = "#id")
public Future<Student> getStudent(String id){
  Student stu  = ...;
  return new AsyncResult<>(stu);
}

Когда я впервые посещаю метод, данные кэшируются в redis в формате json.

но когда я посещаю его во второй раз, возникает какая-то ошибка, подобная этой:

java.util.concurrent.ExecutionException: org.springframework.data.redis.serializer.SerializationException: Невозможно прочитать JSON: Невозможно создать экземпляр org.springframework.scheduling.annotation.AsyncResult (нет создателей, таких как конструкция по умолчанию, не существует): невозможно десериализовать из Object значение (без создателя на основе делегатов или свойств)

[EDIT]

Я нашел обходной путь: новый MyAsyncReslt.java, который расширяет AsyncResult и добавляет NoArgsContructor.

1 Ответ

1 голос
/ 12 мая 2019

Redis Serializer использует Джексона под капотом Класс Jackson2JsonRedisSerializer , ошибка:

Невозможно создать экземпляр org.springframework.scheduling.annotation.AsyncResult (не существует создателей, как конструкция по умолчанию): невозможно десериализовать из значения объекта (без создателя на основе делегатов или свойств)

Кажется, исходящий от Джексона ( не может десериализоваться без конструктора по умолчанию ):

com. )

Убедитесь, что у вас есть модель класса Student, правильно структурированная для совместимости с Джексоном Джексон - Сериализация объектов , так как она используется в AsyncResult через универсальные шаблоны.


Редактировать в соответствии с OP вопросом:

Я нашел обходной путь: новый MyAsyncReslt.java, который расширяет AsyncResult и добавляет NoArgsContructor.

Spring 10 * *, похоже, не реализован должным образом для сериализации с Джексоном (см. Github spring-projects / spring-framework: AsyncResult ).

public class AsyncResult<V> implements ListenableFuture<V> {
    // ...

    public AsyncResult(@Nullable V value) {
        this(value, null);
    }

    private AsyncResult(@Nullable V value, @Nullable Throwable ex) {
        this.value = value;
        this.executionException = ex;
    }

    // Missing empty constructor to comply with Jackson requirements:
    public AsyncResult() {}

// ...

Пока проблема не будет исправлена, вы можете расширить AsyncResult Spring и предоставить необходимый пустой конструктор. Свободно используйте свой собственный AsyncResult в коде.

...