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
进行一些操作
为什么我会看到这个?
答案 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;