如何修复java.io.InvalidClassException: org.springframework.security.core.context.SecurityContextImpl错误

4

我最近升级了Spring Boot应用程序中的Spring版本,结果底层的Spring Security Core也升级到了5.4.5。

现在,在启动Spring Boot应用程序时,我遇到以下问题:

org.eclipse.jetty.server.HttpChannel - handleException / java.io.InvalidClassException: 
org.springframework.security.core.context.SecurityContextImpl; local class incompatible: 
stream classdesc serialVersionUID = 530, local class serialVersionUID = 540

在这种情况下,我在GitHub上找到了这篇文章:https://github.com/spring-projects/spring-security/issues/9204https://github.com/spring-projects/spring-security/issues/3736。但是我无法解决这个问题。请问有人可以在这方面提供帮助吗?谢谢。

2
看起来你正在自己搞版本而不是使用适当的启动器。 - M. Deinum
@M.Deinum,您能否给一些关于如何解决这个问题的指引? - Joy
不要自己搞版本(除非你知道你在做什么),使用启动器来包含依赖项(而不是单独的依赖项)。现在感觉你正在做后者,现在升级Spring Boot会出问题,因为使用了旧的依赖项。 - M. Deinum
1
请发布您的pom.xml文件。 - Toerktumlare
1个回答

2
https://github.com/spring-projects/spring-security/issues/9204中,你可以找到以下内容:"Spring Security不打算在版本之间进行序列化"。
这真是令人震惊。所以所有用户在升级版本时都需要注销吗?
你能做什么呢?对于当前的升级,您必须注销所有用户。但是,您可以为下一个升级做准备:
您需要为会话对象编写自己的序列化。以下是一个项目,他们使用Jackson和一些redis库添加了自己的会话序列化。即使您使用mysql等其他工具,此代码也可以正常工作: https://raw.githubusercontent.com/klboke/apollo/091a757d0a3c2173d6c600cd6a9a1595bb73c10c/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/config/SpringSessionConfig.java 需要注意的一点是,如果您不处于生产状态,则可以添加此配置,当安全库升级时,您就没问题了,但如果您处于生产状态并首次部署此配置,则所有用户都需要先注销,因为会话的序列化将不适合以前的版本!

您不一定需要在第一次部署后注销用户。您可以处理反序列化异常,并在旧会话过期后使用默认转换逻辑。 - Carl-Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接