springboot2.2 +spring-boot-starter-data-redis + shiro-redis3.2.3
在使用方法
Collection<Session> sessions = sessionDAO.getActiveSessions();
时,会直接报错。如下:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: redis.clients.jedis.ScanResult.getStringCursor()Ljava/lang/String;] with root cause
java.lang.NoSuchMethodError: redis.clients.jedis.ScanResult.getStringCursor()Ljava/lang/String;
是因为
2.2版本的data-redis使用的是3.1.0的jedis,而shiro-redis使用的是2.9.0的jedis,shiro-redis下WorkAloneRedisManager的keys方法中,在循环从scanResult中获取keys时使用了scanResult.getStringCursor().compareTo(ScanParams.SCAN_POINTER_START) > 0的条件,而jedis在3.0之后将getStringCursor方法改为getCursor,所以才出现了错误。
解决办法:在pom内指定jedis版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
</dependencyManagement>
参考:https://blog.csdn.net/w309827333/article/details/104002300,感谢。