redis反序列化异常

使用spring security扩展Userdetail 实现oauth2 时用redis做缓存实现序列化与反序列化时,遇到了下面的错误:

原因:往Userdetail的实现类中添加了字段使得程序启动正常,sevrlet转发时异常

猜测: user 类扩展了security的Userdetail,用了redis做缓存。新增字段后,序列化的内容可能key一样并且没过期就没刷新redis的内容,导致反序列化时,字段对不上

直接把redis里面的缓存全部清空就可以了

 

 

2020-02-20 15:29:26.128 [http-nio-8000-exec-1] INFO  o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]:173 - Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-02-20 15:29:26.129 [http-nio-8000-exec-1] INFO  org.springframework.web.servlet.DispatcherServlet:525 - Initializing Servlet 'dispatcherServlet'
2020-02-20 15:29:26.139 [http-nio-8000-exec-1] INFO  org.springframework.web.servlet.DispatcherServlet:547 - Completed initialization in 10 ms
unable to decode: =org.springframework.security.core.context.SecurityContextImpl Oorg.springframework.security.auth
2020-02-20 15:29:26.277 [http-nio-8000-exec-1] ERROR o.a.c.c.C.[.[localhost].[/].[dispatcherServlet]:175 - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
java.io.IOException: java.lang.RuntimeException: class not found CLASSNAME: loader:sun.misc.Launcher$AppClassLoader@18b4aac2
    at org.nustaq.serialization.FSTObjectInput.readObject(FSTObjectInput.java:247)
    at org.nustaq.serialization.FSTConfiguration.asObject(FSTConfiguration.java:1158)
    at org.hzcb.common.lang.ObjectUtils.unserializeFst(ObjectUtils.java:242)
    at org.hzcb.config.redis.serializer.RedisObjectSerializer.deserialize(RedisObjectSerializer.java:38)
    at org.springframework.data.redis.core.AbstractOperations.deserializeHashValue(AbstractOperations.java:355)
    at org.springframework.data.redis.core.AbstractOperations.deserializeHashMap(AbstractOperations.java:299)
    at org.springframework.data.redis.core.DefaultHashOperations.entries(DefaultHashOperations.java:247)
    at org.springframework.data.redis.core.DefaultBoundHashOperations.entries(DefaultBoundHashOperations.java:183)
    at org.springframework.session.data.redis.RedisIndexedSessionRepository.getSession(RedisIndexedSessionRepository.java:440)
    at org.springframework.session.data.redis.RedisIndexedSessionRepository.findById(RedisIndexedSessionRepository.java:412)
    at org.springframework.session.data.redis.RedisIndexedSessionRepository.findById(RedisIndexedSessionRepository.java:249)
    at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.getRequestedSession(SessionRepositoryFilter.java:351)
    at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.getSession(SessionRepositoryFilter.java:289)
    at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.getSession(SessionRepositoryFilter.java:192)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:244)
    at org.springframework.security.web.context.HttpSessionSecurityContextRepository.loadContext(HttpSessionSecurityContextRepository.java:111)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:100)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:141)
    at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:108)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Fastjson是一个用于Java的高性能JSON处理库,可以方便地进行JSON的序列化和反序列化反序列化是将JSON格式的数据转换为Java对象的过程。在Redis中存储的value可以是任意类型的数据,包括字符串、数字、列表、哈希等。当我们从Redis中获取到value时,需要将其反序列化为对应的Java对象才能进行进一步的操作。 使用Fastjson进行反序列化Redis value的步骤如下: 1. 导入Fastjson库:首先需要将Fastjson的库添加到项目的依赖中,可以通过Maven或手动下载并导入相应的jar包。 2. 获取Redis value:从Redis中获取到的value可以通过Redis客户端的API来获取,一般是以字符串的形式返回。 3. 使用Fastjson进行反序列化:将获取到的Redis value以字符串的形式传递给Fastjson的反序列化方法,然后指定要转换的Java对象的类型。Fastjson会自动将JSON字符串转换为对应类型的Java对象,可以直接进行操作。 示例代码如下: ```java import com.alibaba.fastjson.JSON; ... // 假设从Redis中获取到的value是一个包含学生信息的JSON字符串 String redisValue = redisClient.get("studentInfo"); // 使用Fastjson将JSON字符串反序列化为Student对象 Student student = JSON.parseObject(redisValue, Student.class); // 可以直接对student对象进行操作 System.out.println(student.getName()); System.out.println(student.getAge()); ... ``` 通过上述步骤,我们可以使用Fastjson方便地将Redis中的value反序列化Java对象,从而可以在应用程序中对其进行进一步的操作。需要注意的是,Fastjson在进行反序列化时,需要确保JSON字符串的格式与目标Java对象类型的属性一一对应,否则可能会出现异常。 ### 回答2: Fastjson是一款Java语言中的快速JSON解析库,能够高效地将JSON字符串转换为Java对象。对于Redis而言,它可以将Redis存储的JSON格式的value值反序列化Java对象。 在实际应用中,我们通常会使用Fastjson提供的`parseObject()`方法进行反序列化操作。首先,我们需要将Redis中获取到的JSON字符串作为参数传递给该方法,Fastjson会根据JSON的结构和定义的目标对象类型将其转换成对应的Java对象。 具体的使用步骤如下: 1. 首先,我们需要从Redis中获取到存储的JSON字符串。 2. 使用Fastjson的`parseObject()`方法将JSON字符串转换为Java对象。例如,如果我们希望将JSON字符串转换成User对象,可以使用如下代码: `User user = JSON.parseObject(jsonString, User.class);` 这里的`jsonString`是从Redis中获取到的JSON字符串,`User.class`表示目标对象的类型。 3. 对于嵌套的JSON结构,Fastjson也能够很好地支持反序列化操作。例如,假设User对象中包含了Address对象作为属性,我们同样可以使用`parseObject()`方法将其转换成对应的Java对象。 总结而言,Fastjson是一款高效的JSON解析库,可以帮助我们将Redis中存储的JSON格式的value值反序列化Java对象。通过使用`parseObject()`方法,我们可以方便地将JSON字符串转换为目标对象,并且对于嵌套的JSON结构同样能够很好地支持。 ### 回答3: Fastjson是一种Java的JSON处理库,它提供了封装简单、速度快的特点,常用于序列化和反序列化JSON数据。在使用Fastjson进行反序列化时,可以将Redis中存储的JSON数据进行解析,转换为Java对象。 通常情况下,我们在往Redis中存储数据时会将数据转换为JSON格式,Fastjson可以将这些JSON数据转换为Java对象,方便我们在程序中进行操作。Fastjson提供了灵活的反序列化功能,可以将JSON字符串映射到Java对象的属性上,同时也支持从JSON数组中解析多个对象。 在反序列化Redis中的value时,我们可以首先使用Redis客户端从Redis中获取到相应的value,接着使用Fastjson的`parseObject`方法将这个value转换为Java对象。例如: ``` String redisValue = jedis.get("key"); // 从Redis中获取到value MyClass myObject = JSON.parseObject(redisValue, MyClass.class); // 使用Fastjson反序列化Java对象 ``` 在上述代码中,`MyClass`是自定义的Java类,表示了一个与Redis中value对应的数据模型,`redisValue`则是获取到的Redis value对应的字符串。`JSON.parseObject`方法会根据字符串的内容将其转换为与`MyClass`结构相同的Java对象。 需要注意的是,在反序列化时,要确保将数据转换为正确的数据类型,否则可能会导致类型转换错误或其他异常。此外,Fastjson也提供了更多的反序列化选项和定制能力,可以根据具体需要进行配置。 总之,Fastjson可以作为一个强大的工具,用于反序列化Redis中的value数据,将之转换为Java对象,便于在程序中进行进一步的处理和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值