gpt4 book ai didi

java - Spring session ,部署后从 "local class incompatible"恢复

转载 作者:行者123 更新时间:2023-12-02 10:47:24 28 4
gpt4 key购买 nike

Spring session 将序列化对象存储在我的数据库中。问题是,有时我的代码会发生变化。有时我的对象会改变。这个是正常的。但是,我收到这样的错误:

org.springframework.core.convert.ConversionFailedException: Failed to convert from type [byte[]] to type [java.lang.Object] for value '{-84, ..., 112}'; 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 java.io.InvalidClassException: com.mysite.MyClass; local class incompatible: stream classdesc serialVersionUID = 1432849980928799324, local class serialVersionUID = 8454085305026634675

我通过使用 HttpSession 作为参数调用 Spring Boot 端点来获得此错误,如下所示:

@GetMapping("/stuff")
public @ResponseBody MyClass getStuff(HttpSession session) {
try {
Object myObject = session.getAttribute("MyClass");
if (myObject != null && myObject instanceof MyClass) {
return (MyClass) myObject;
} else {
return null;
}
} catch (Exception e) {
logger.warn("Invalid session data", e);
return null;
}
}

但是,由于异常是在调用方法之前引发的,因此我无法从这个正常的预期错误中恢复。

作为解决方法,我被迫在每次部署时删除整个 session 表,即使大多数对象仍然兼容!

需要明确的是,解决方案不是添加serialVersionUuid。因为从一个部署到下一个部署,对象确实会以不兼容的方式发生变化。这不是一个序列化问题。这是一个Spring Session错误恢复问题。

我的问题是:如何从这些问题中正常恢复?

最佳答案

您没有提供详细信息,但我假设您正在使用由 @EnableJdbcHttpSession 启用的 Spring JDBC session 实现?

在这种情况下,您可以查看 JdbcHttpSessionConfiguration,特别是 setSpringSessionConversionServicesetConversionService。我相信,如果您提供自己的实现(您可以在 createConversionServiceWithBeanClassLoader 中查看示例),那么您应该能够捕获反序列化错误并返回空 session 。

我认为您需要的只是从 DeserializingConverter 派生 MyNotFailingSessionDeserializer,重写 convert 方法,捕获 SerializationFailedException 并返回null 或空 session (不确定是否有效)。

然后,您像 createConversionServiceWithBeanClassLoader 一样创建转换服务,但使用 MyNotFailingSessionDeserializer 而不是 DeserializingConverter

关于java - Spring session ,部署后从 "local class incompatible"恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52451436/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com