无法将缓存的 json 数据反序列化为 AsyncResult
Can not deserialize cached json data to AsyncResult
我正在使用 spring 缓存和 redis 实现,我有以下方法
@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
的实例(不存在 Creator,如默认构造):无法从对象反序列化价值(无代表或 属性-based Creator)
[编辑]
我找到了一个解决方法:新的 MyAsyncReslt.java 它扩展了 AsyncResult 并添加了 NoArgsContructor。
Redis Serializer 在引擎盖下使用 Jackson Class Jackson2JsonRedisSerializer,错误:
Cannot construct instance of org.springframework.scheduling.annotation.AsyncResult
(no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
似乎是 Jackson () 的结果:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of Type
(no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
确保您的模型 class Student
结构正确以符合 Jackson Jackson - Object Serialization,因为它通过泛型在 AsyncResult
中使用。
根据OP问题编辑:
I found a workaround : new a MyAsyncReslt.java which extends AsyncResult and add the 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。
我正在使用 spring 缓存和 redis 实现,我有以下方法
@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
的实例(不存在 Creator,如默认构造):无法从对象反序列化价值(无代表或 属性-based Creator)
[编辑]
我找到了一个解决方法:新的 MyAsyncReslt.java 它扩展了 AsyncResult 并添加了 NoArgsContructor。
Redis Serializer 在引擎盖下使用 Jackson Class Jackson2JsonRedisSerializer,错误:
Cannot construct instance of
org.springframework.scheduling.annotation.AsyncResult
(no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
似乎是 Jackson (
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of
Type
(no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
确保您的模型 class Student
结构正确以符合 Jackson Jackson - Object Serialization,因为它通过泛型在 AsyncResult
中使用。
根据OP问题编辑:
I found a workaround : new a MyAsyncReslt.java which extends AsyncResult and add the 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。