场景

使用redis工具类获取redis数据时出现异常


异常信息

org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Could not resolve type id 'com.xxx.entity.corpwx.redis.AppToken' as a subtype of `java.lang.Object`: no such class found
 at [Source: (byte[])"{"@class":"com.xxx.entity.corpwx.redis.AppToken","accesstoken":"a-w8brAPf3A_yXYTAvug3zPFCTPqGDKVNAgxsndgZSDHQDVy0MHa_7IG9vsL9CG2jm0zwdBGriN6VRCbaeRmDq0M51xs_bTjODH6ShFbHX4g8eJjucKRr3KCYPyct_YdjTa0kozxcf9fKMmqih_WOCxQRTHclWYOg3gLjp2iSIzw6NYNp3EcWiPCBtLMZO_cX75FmeLaS18WYA2l7oLqAg","agentid":""}"; line: 1, column: 11]; nested exception is com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'com.xxx.entity.corpwx.redis.AppToken' as a subtype of `java.lang.Object`: no such class found
 at [Source: (byte[])"{"@class":"com.xxx.entity.corpwx.redis.AppToken","accesstoken":"a-w8brAPf3A_yXYTAvug3zPFCTPqGDKVNAgxsndgZSDHQDVy0MHa_7IG9vsL9CG2jm0zwdBGriN6VRCbaeRmDq0M51xs_bTjODH6ShFbHX4g8eJjucKRr3KCYPyct_YdjTa0kozxcf9fKMmqih_WOCxQRTHclWYOg3gLjp2iSIzw6NYNp3EcWiPCBtLMZO_cX75FmeLaS18WYA2l7oLqAg","agentid":""}"; line: 1, column: 11]
	at org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer.deserialize(GenericJackson2JsonRedisSerializer.java:165)
	at org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer.deserialize(GenericJackson2JsonRedisSerializer.java:143)
	at org.springframework.data.redis.core.AbstractOperations.deserializeValue(AbstractOperations.java:360)
	at org.springframework.data.redis.core.AbstractOperations$ValueDeserializingRedisCallback.doInRedis(AbstractOperations.java:62)
	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:224)
	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:191)
	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:97)
	at org.springframework.data.redis.core.DefaultValueOperations.get(DefaultValueOperations.java:54)
	at com.xxx.util.RedisUtil.get(RedisUtil.java:222)
	at com.xxx.corpwx.util.WechatCpUtil.getCorpWxAppTokenKey(WechatCpUtil.java:2089)
	at com.xxx.corpwx.util.WechatCpUtil.downloadAndSaveUserInfo(WechatCpUtil.java:1892)
	at com.xxx.util.RocketMQMessageUtil.processWechatCpArchiveMessage(RocketMQMessageUtil.java:370)
	at com.xxx.util.RocketMQMessageUtil.put2RocketWorkQueue(RocketMQMessageUtil.java:96)
	at com.xxx.corpwx.util.WechatCpUtil.handleSessionArchiveMsg(WechatCpUtil.java:1758)
	at com.xxx.corpwx.controller.CorpSessionArchiveController.corpWxSessionArchivePush(CorpSessionArchiveController.java:81)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:126)
	at org.springframework.boot.web.servlet.support.ErrorPageFilter.access$000(ErrorPageFilter.java:64)
	at org.springframework.boot.web.servlet.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:101)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:698)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:367)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:639)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:882)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1647)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:750)
Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'com.xxx.entity.corpwx.redis.AppToken' as a subtype of `java.lang.Object`: no such class found
 at [Source: (byte[])"{"@class":"com.xxx.entity.corpwx.redis.AppToken","accesstoken":"a-w8brAPf3A_yXYTAvug3zPFCTPqGDKVNAgxsndgZSDHQDVy0MHa_7IG9vsL9CG2jm0zwdBGriN6VRCbaeRmDq0M51xs_bTjODH6ShFbHX4g8eJjucKRr3KCYPyct_YdjTa0kozxcf9fKMmqih_WOCxQRTHclWYOg3gLjp2iSIzw6NYNp3EcWiPCBtLMZO_cX75FmeLaS18WYA2l7oLqAg","agentid":""}"; line: 1, column: 11]
	at com.fasterxml.jackson.databind.exc.InvalidTypeIdException.from(InvalidTypeIdException.java:43)
	at com.fasterxml.jackson.databind.DeserializationContext.invalidTypeIdException(DeserializationContext.java:2073)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownTypeId(DeserializationContext.java:1564)
	at com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver._typeFromId(ClassNameIdResolver.java:76)
	at com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:66)
	at com.fasterxml.jackson.databind.jsontype.impl.TypeDeserializerBase._findDeserializer(TypeDeserializerBase.java:159)
	at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:125)
	at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:110)
	at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromAny(AsPropertyTypeDeserializer.java:213)
	at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.deserializeWithType(UntypedObjectDeserializer.java:781)
	at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:74)
	at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4674)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3690)
	at org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer.deserialize(GenericJackson2JsonRedisSerializer.java:163)
	... 67 common frames omitted

排查

1、从报错信息上看是redis获取数据时,在Java类型转换出现的异常

“com.xxx.entity.corpwx.redis.AppToken"无法转为"java.lang.Object”

说明该redis数据在保存的时候就是保存的"com.xxx.entity.corpwx.redis.AppToken"对象,那么取出来也要用这个对象才行,而且包名要与redis数据类型的包名一致


原因

没有按redis保存的数据类型来接收返回结果


解决

获取redis数据时,按redis的数据类型来接收返回结果(对象的包名要与redis数据的包名完全一致

// 强转为对应的数据类型
AppToken appToken = (AppToken) redisUtil.get(appTokenKey);
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐