我正在使用带有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。
答案 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。