无法将缓存的json数据反序列化为AsyncResult

时间:2019-05-10 06:33:50

标签: java spring redis spring-cache

我正在使用带有Redis实现的Spring缓存,我有以下方法

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

当我第一次访问该方法时,数据以json格式缓存到redis中。

但是当我第二次访问它时,它会发生如下错误:

java.util.concurrent.ExecutionException:org.springframework.data.redis.serializer.SerializationException:无法读取JSON:无法构造org.springframework.scheduling.annotation.AsyncResult的实例(不存在任何创建者,例如默认构造):无法反序列化来自对象值(没有基于委托或属性的创建者)

[编辑]

我找到了一种解决方法:新建一个MyAsyncReslt.java,它扩展了AsyncResult并添加了NoArgsContructor。

1 个答案:

答案 0 :(得分:1)

Redis序列化器在Class Jackson2JsonRedisSerializer下使用杰克逊,错误:

  

无法构造org.springframework.scheduling.annotation.AsyncResult的实例(不存在创建者,如默认构造一样):无法从对象值反序列化(不存在基于委托或基于属性的创建者)

似乎即将从杰克逊(can't deserialize without default constructor)中消失:

  

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造Type的实例(不存在创建者,如默认构造一样):无法从Object值反序列化(没有委托或属性,造物主)

请确保您的模型类Student的结构正确,以便与AsyncResult中通过泛型使用的杰克逊Jackson - Object Serialization兼容。


根据OP问题进行编辑:

  

我找到了一种解决方法:新建一个MyAsyncReslt.java,它扩展了AsyncResult并添加了NoArgsContructor。

Spring的AsyncResult似乎没有正确实现以与Jackson进行序列化(请检查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() {}

// ...

在此问题得到解决之前,您可以扩展Spring的AsyncResult并提供所需的空构造函数。在代码中自由使用自定义的AsyncResult。