Spring Redis 与 DefaultSavedRequest spring 安全类的序列化问题

问题描述 投票:0回答:1

我使用 spring-session-data-redis 、 spring-boot-starter-data-redis 在 Redis 中进行会话持久化。该应用程序的 springboot 版本是 3.2.6 我还使用 springboot security 和 OAuth2 进行登录。

以下是用于将会话数据序列化到 Redis 或从 Redis 中反序列化的 Redis 会话配置。

@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
   return new GenericJackson2JsonRedisSerializer("_classType");
}
  

但是在尝试登录应用程序时,我收到以下错误

org.springframework.data.redis.serializer.SerializationException: Could not read JSON:Cannot construct instance of `org.springframework.security.web.savedrequest.DefaultSavedRequest` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (byte[])"{"_classType":"java.util.HashMap","lastAccessedTime":["java.lang.Long",1721629583744],"maxInactiveInterval":3300,"creationTime":["java.lang.Long",1721629583744],"sessionAttr:SPRING_SECURITY_SAVED_REQUEST":{"_classType":"org.springframework.security.web.savedrequest.DefaultSavedRequest","cookies":["java.util.ArrayList",[{"_classType":"jakarta.servlet.http.Cookie","name":"XSRF-TOKEN","value":"509d859a-215f-408e-85f9-30515ce4ab12","attributes":{"_classType":"java.util.Collections$UnmodifiableMap",""[truncated 1126 bytes]; line: 1, column: 288] (through reference chain: java.util.HashMap["sessionAttr:SPRING_SECURITY_SAVED_REQUEST"]) 
    at org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer.deserialize(GenericJackson2JsonRedisSerializer.java:292) ~[spring-data-redis-3.2.6.jar:3.2.6]
    at org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer.deserialize(GenericJackson2JsonRedisSerializer.java:261) ~[spring-data-redis-3.2.6.jar:3.2.6]
    at org.springframework.session.data.redis.RedisIndexedSessionRepository.onMessage(RedisIndexedSessionRepository.java:573) ~[spring-session-data-redis-3.2.3.jar:3.2.3]
    at org.springframework.data.redis.listener.RedisMessageListenerContainer.processMessage(RedisMessageListenerContainer.java:818) ~[spring-data-redis-3.2.6.jar:3.2.6]
    at org.springframework.data.redis.listener.RedisMessageListenerContainer.lambda$dispatchMessage$23(RedisMessageListenerContainer.java:976) ~[spring-data-redis-3.2.6.jar:3.2.6]
    at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]

我尝试按照 spring 文档配置序列化器,但这不起作用

有人可以帮我解决这个问题吗?

java spring spring-security spring-data-redis spring-session
1个回答
0
投票

(不存在创建者,如默认构造函数):无法从对象值反序列化(没有基于委托或属性的创建者)

我假设你的 DTO 有一个自定义构造函数。
您应该为反序列化创建一个无参数构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.