关于redis报错SerializationException的两个值得注意的地方

àì夳堔傛蜴生んèń 2022-01-10 16:57 487阅读 0赞

整合redis时,遇到序列化异常,报错信息如下:

  1. org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.InvalidClassException: com.zgw.tmall.pojo.Category; class invalid for deserialization
  2. at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:82)
  3. at org.springframework.data.redis.cache.RedisCache$CacheValueAccessor.deserializeIfNecessary(RedisCache.java:477)
  4. at org.springframework.data.redis.cache.RedisCache.lookup(RedisCache.java:323)
  5. at org.springframework.data.redis.cache.RedisCache.get(RedisCache.java:184)
  6. at org.springframework.data.redis.cache.RedisCache.get(RedisCache.java:133)
  7. at org.springframework.cache.interceptor.AbstractCacheInvoker.doGet(AbstractCacheInvoker.java:71)
  8. at org.springframework.cache.interceptor.CacheAspectSupport.findInCaches(CacheAspectSupport.java:536)
  9. at org.springframework.cache.interceptor.CacheAspectSupport.findCachedItem(CacheAspectSupport.java:502)
  10. at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:388)
  11. at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:326)
  12. at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61)
  13. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
  14. at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
  15. at com.zgw.tmall.service.CategoryService$$EnhancerBySpringCGLIB$$9b0a286f.list(<generated>)
  16. at com.zgw.tmall.interceptor.OtherInterceptor.postHandle(OtherInterceptor.java:42)
  17. at org.springframework.web.servlet.HandlerExecutionChain.applyPostHandle(HandlerExecutionChain.java:151)
  18. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:974)
  19. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
  20. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
  21. at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
  22. at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
  23. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
  24. at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
  25. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
  26. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  27. at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
  28. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  29. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  30. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  31. at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108)
  32. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  33. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  34. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  35. at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
  36. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  37. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  38. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  39. at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
  40. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  41. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  42. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  43. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
  44. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
  45. at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
  46. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
  47. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
  48. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
  49. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
  50. at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
  51. at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
  52. at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
  53. at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
  54. at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
  55. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  56. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  57. at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
  58. at java.lang.Thread.run(Thread.java:745)

百度了下大概是因为没有实现Serializable接口,因为Spring会将对象先序列化再存入 Redis,查看我自己的代码确实是没有实现的。

  1. public class Category implements Serializable

加上后重新启动项目,页面没有显示数据,查看后台日志显示异常:

  1. Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request
  2. processing failed; nested exception is org.springframework.data.redis.serializer.
  3. SerializationException: Could not read JSON:
  4. Unrecognized field "hasContent"
  5. (class tmall_springboot.syl.util.Page4Navigator), not marked as ignorable (13
  6. known properties: "totalPages", "size", "isHasNext", "isHasPrevious", "number", "navigatepageNums", "first",
  7. "navigatePages", "last", "numberOfElements", "content", "totalElements", "isHasContent"])

仔细查看代码,发现Page4Navigator中布尔类型变量定义如图示:

  1. boolean isHasNext;
  2. boolean isHasPrevious;

参考阿里巴巴开发手册第八条:
在这里插入图片描述
再将is开头的几个属性,修改为了非is开头之后,就没有这个问题了。

  1. //是否有下一页
  2. private boolean hasNext;
  3. //是否有上一页
  4. private boolean hasPrevious;

发表评论

表情:
评论列表 (有 0 条评论,487人围观)

还没有评论,来说两句吧...

相关阅读