Spring Session Redis无法使用ClassNotFoundException反序列化

时间:2016-10-07 02:08:56

标签: java spring spring-boot redis spring-session

org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; 
  nested exception is org.springframework.core.serializer.support.SerializationFailedException:

Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; 
  nested exception is org.springframework.core.NestedIOException:

Failed to deserialize object type; 
  nested exception is java.lang.ClassNotFoundException: com.foo.user.model.CurrentUser

我有两个典型的Spring Boot应用程序,它们共享会话状态的Redis实例。尝试登录我的应用程序时会立即发生上述错误。

我不太确定这里发生了什么 - 这两个应用程序对适用的用户模型和Spring依赖项使用相同的库和版本。它的值CurrentUser延伸org.springframework.security.core.userdetails.User,其本身为Serializable

我已经重新启动了我的Redis实例,认为某些东西变得很时髦,但事实并非如此。我已经展示了我已经尝试过的内容,但主要是确保我的工件正确构建并重新启动应用程序和Redis服务器,并使用Serializable进行一些操作

为什么我会看到这个?

3 个答案:

答案 0 :(得分:1)

当发送方服务器与接收方服务器(单独的服务器)不同时,您很可能会收到此错误

问题来自 ValueSerializer

为避免此问题,请使用 Jackson2JsonRedisSerializer 作为发送方和接收方的值 Serializer

    @Bean
    protected RedisTemplate<String, Object> redisTemplate() {
      final RedisTemplate<String, Object> template = new RedisTemplate<>();
      template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
      .........
      return template;
    }

这样序列化过程将基于 json 而不是基于类

答案 1 :(得分:0)

例外情况说&#39;无法反序列化&#39; 看起来你在Redis中存储了一些东西,现在无法反序列化。 可能是你同时更改了serialVersionUID?

我看到你重新启动了Redis,但可能是该条目是持续存在并在重启后幸免于难?

答案 2 :(得分:0)

当您将数据存储到 redis 时,只需将其类型转换为 Object 类,当您从 redis 取回它时,只需将其作为 Object 获取。然后将其类型转换为您拥有的任何 POJO 类。它在我的情况下有效。 存储时->

redisTemplate.opsForHash().put("<YOUR-key>", "<YOUR-field>",(Object) empList);

获取时->

Object employeeFromCache=operation.get("<YOUR-key>", "<YOUR-field>");
        employees=(List<Employee>)employeeFromCache;