我将Infinispan缓存用作 session 作用域的bean,以在Spring MVC应用程序中缓存与用户相关的数据对象。

现在我们迁移到 Spring 启动,我们想使用@enableRedisHttpSession
但是我们面临的问题是,连接到 session 的Infinispan CacheManager无法序列化,从而产生以下异常:

java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [org.infinispan.spring.provider.SpringEmbeddedCacheManagerFactoryBean]
    org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:43)
    org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:63)
    org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:35)
    org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:50)
    org.springframework.data.redis.core.AbstractOperations.rawHashValue(AbstractOperations.java:166)
    org.springframework.data.redis.core.DefaultHashOperations.putAll(DefaultHashOperations.java:128)
    org.springframework.data.redis.core.DefaultBoundHashOperations.putAll(DefaultBoundHashOperations.java:85)
    org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.saveDelta(RedisOperationsSessionRepository.java:409)
    org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.access$000(RedisOperationsSessionRepository.java:331)
    org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:211)
    org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:141)
    org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:193)
    org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.access$100(SessionRepositoryFilter.java:169)
    org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:127)
    org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:65)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:103)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

通常,我们会将用户请求平衡到多个节点,因此我们需要使节点之间共享缓存(使用Redis存储)。

谁能帮忙。

最佳答案

显然,缓存管理器不可序列化,因为它不应该序列化-它不是数据。您必须跟踪引用SpringEmbeddedCacheManagerFactoryBean的字段并使该瞬变。

09-15 21:46