代码之家  ›  专栏  ›  技术社区  ›  rellocs wood

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

  •  0
  • rellocs wood  · 技术社区  · 7 年前

    我使用springcache实现redis,我有以下方法

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

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

    但是当我第二次访问它时,它会出现这样的错误:

    java.util.concurrent。执行异常:org.springframework.data.redis.serializer.SerializationException:无法读取JSON:无法构造的实例 org.springframework.scheduling.annotation.AsyncResult

    [编辑]

    我找到了一个解决办法:新的MyAsyncReslt.java它扩展了AsyncResult并添加了noargscontractor。

    0 回复  |  直到 7 年前
        1
  •  1
  •   Xarvalus    7 年前

    Class Jackson2JsonRedisSerializer ,错误:

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

    can't deserialize without default constructor ):

    无法构造的实例 Type

    确保你有你的模型班 Student 结构合理,符合杰克逊的要求 Jackson - Object Serialization 因为它在 AsyncResult


    我找到了一个解决办法:新的MyAsyncReslt.java它扩展了AsyncResult并添加了noargscontractor。

    春天的 异步结果 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。