今天在对SpringBoot项目升级的时候,把2.1.8.RELEASE
升级到了 2.3.2.RELEASE(2.3.2 — 2.4.2区间内的版本是这样,其他的springboot版本 本人没试过)
,运行后发现,
在获取在线用户的时候,报了一个错误,日志如下:
Caused by: java.lang.NoSuchMethodError: redis/clients/jedis/ScanResult.getStringCursor()Ljava/lang/String; (loaded from file:/E:/m2/repository/redis/clients/jedis/3.3.0/jedis-3.3.0.jar by sun.misc.Launcher$AppClassLoader@1a61fefc) called from class org.crazycake.shiro.WorkAloneRedisManager (loaded from file:/E:/m2/repository/org/crazycake/shiro-redis/3.2.3/shiro-redis-3.2.3.jar by sun.misc.Launcher$AppClassLoader@1a61fefc).
at org.crazycake.shiro.WorkAloneRedisManager.keys(WorkAloneRedisManager.java:149)
at org.crazycake.shiro.RedisSessionDAO.getActiveSessions(RedisSessionDAO.java:110)
at aoshu.bi.monitor.service.impl.SessionServiceImpl.list(SessionServiceImpl.java:35)
at aoshu.bi.monitor.controller.SessionController.list(SessionController.java:31)
at aoshu.bi.monitor.controller.SessionController$$FastClassBySpringCGLIB$$a006a1f.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82)
at org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39)
at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)
at aoshu.bi.monitor.controller.SessionController$$EnhancerBySpringCGLIB$$cfa3f04c.list(<generated>)
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:190)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
... 64 common frames omitted
主要看这里如下错误:
Caused by: java.lang.NoSuchMethodError: redis/clients/jedis/ScanResult.getStringCursor()Ljava/lang/String;
这里调的方法是业务里获取在线用户的方法,
项目引入了 Shiro ,引入了Shiro-redis 这个开源项目
<dependency>
<groupId>org.crazycake</groupId>
<artifactId>shiro-redis</artifactId>
<version>3.2.3</version>
</dependency>
Debug 发现 ,底层调用了 scanResult.getStringCursor()
这个方法
而SpringBoot 2.3 依赖的jedis 的版本为 3.1,已经改为 public String getCursor()
这个方法了 ,没有了 2.9.3 getStringCursor()
方法
解决方法
由于 Shiro-redis 已经不再维护了,那么只能手动引入 jedis的 2.9.3
版本
在pom.xml
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.6.1</elasticsearch.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<jedis.version>2.9.3</jedis.version>
</properties>