java.lang.IncompatibleClassChangeError: class org.springframework.session.hazelcast.PrincipalNameExtractor

java.lang.IncompatibleClassChangeError: class org.springframework.session.hazelcast.PrincipalNameExtractor

我正在尝试为 spring 安全 oauth2 客户端应用程序配置 spring 由 hazelcast 支持的会话。

我按照以下 link 配置了 hazelcast。 https://docs.spring.io/spring-session/docs/current/reference/html5/guides/java-hazelcast.html

但是,由于以下错误,使用@SpringBootTest 注释的类 开始失败:

java.lang.IncompatibleClassChangeError: class org.springframework.session.hazelcast.PrincipalNameExtractor has interface com.hazelcast.query.extractor.ValueExtractor as super class

我的 pom.xml of spring boot 2.5 应用程序包含以下两个新的 hazelcast 配置依赖项

       <dependency>
            <groupId>com.hazelcast</groupId>
            <artifactId>hazelcast</artifactId>
            <version>4.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-hazelcast</artifactId>
        </dependency>

根据下面的 Whosebug post,问题似乎是 ValueExtractor 可用于 Maven 依赖项中的两个不同版本 IncompatibleClassChangeError: class ClassMetadataReadingVisitor has interface ClassVisitor as super class

因此,我检查了 Maven 依赖项,可以看到 PrincipalNameExtractor 可从 spring-session-hazelcast 的 2.5 版本开始使用,而 ValueExtractor 可从 com.hazelcast 的 4.2 版本开始使用。然而, spring-session-hazelcast 正在使用 3.12.12 版本的 com.hazelcast 进行编译。

所以我应该使用 com.hazelcast 的 3.12.12 版本来解决这个问题还是我误解了这个问题?我更喜欢使用最新版本。

从 spring-sessions v2.4.0 开始,您可以使用 Hazelcast v4.x 并为会话存储库配置 Hazelcast4PrincipalNameExtractorHazelcast4IndexedSessionRepository。唯一的区别是带有 4 指示符的 class 名称。也就是说,HazelcastIndexedSessionRepository 变为 4.x 与 Hazelcast4IndexedSessionRepository 兼容。

这是涵盖两个版本的指南:https://guides.hazelcast.org/spring-session-hazelcast/