开发者社区> 问答> 正文

ClassCastException异常 400 请求出错

我在使用JedisCluster的实例,调用它的方法getClusterNodes()然后给一个JedisPool赋值的时候,提示我一个ClassCastException,具体的栈信息如下:


java.lang.ClassCastException: redis.clients.jedis.JedisPool cannot be cast to redis.clients.jedis.JedisPool
	at com.redis.monitor.redis.impl.RedisServiceImpl.ping(RedisServiceImpl.java:537)
	at com.redis.monitor.manager.impl.RedisManagerImpl.ping(RedisManagerImpl.java:190)
	at com.redis.monitor.web.interceptor.ServerInteceptor.preHandle(ServerInteceptor.java:93)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:891)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:693)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:533)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1351)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1322)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:473)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:514)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:920)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:403)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:184)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:856)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:114)
	at org.eclipse.jetty.server.Server.handle(Server.java:352)
	at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:596)
	at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:1049)
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:590)
	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:212)
	at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:426)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:510)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint.access$000(SelectChannelEndPoint.java:34)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:450)
	at java.lang.Thread.run(Thread.java:722)
代码如下:



public String ping(Redis redis) {
	Jedis jedis = null;
	JedisPool jp = null;
	boolean broken = false;
	try {
		Map<String, JedisPool> poolMap = redis.getJedisCluster().getClusterNodes();
		for(JedisPool jp1:poolMap.values()){
			jedis = jp1.getResource();
			jedis.ping();
		}
	} catch (JedisConnectionException jce) {
		broken = true;
	} catch (Exception e) {
		e.printStackTrace();
	} 
	return "";
}

在for循环赋值给JedisPool的时候会出错.

大家帮忙看看是怎么回事





展开
收起
黄一刀 2020-05-26 20:30:58 558 0
1 条回答
写回答
取消 提交回答
  • 引用来自“编走编想”的评论

    类名相同,但是还报 ClassCastException,那原因基本上就是 ClassLoader 不同导致的了

    引用来自“lizhi.zero”的评论

    说的很对,估计在你的tomcat lib下面和你的项目环境下面或者其他什么地方有多个Jedis的jar包

    引用来自“小小太阳”的评论

    我在上边对JedisPool进行了一下构造, 失败了,也报了一个异常:

    Caused by: java.lang.NoSuchMethodError: redis.clients.jedis.JedisPool: method <init>()V not found
    	at com.redis.monitor.redis.impl.RedisServiceImpl.ping(RedisServiceImpl.java:530)
    	at com.redis.monitor.manager.impl.RedisManagerImpl.ping(RedisManagerImpl.java:190)
    	at com.redis.monitor.web.interceptor.ServerInteceptor.preHandle(ServerInteceptor.java:93)
    	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:891)
    	... 31 more



    这个问题我查了一下,也没搜到个结果来.

    你的jedis的版本冲突了,你那个异常说明有不同版本的jar######类名相同,但是还报 ClassCastException,那原因基本上就是 ClassLoader 不同导致的了######

    引用来自“编走编想”的评论

    类名相同,但是还报 ClassCastException,那原因基本上就是 ClassLoader 不同导致的了
    说的很对,估计在你的tomcat lib下面和你的项目环境下面或者其他什么地方有多个Jedis的jar包
    ######

    引用来自“编走编想”的评论

    类名相同,但是还报 ClassCastException,那原因基本上就是 ClassLoader 不同导致的了

    引用来自“lizhi.zero”的评论

    说的很对,估计在你的tomcat lib下面和你的项目环境下面或者其他什么地方有多个Jedis的jar包

    我在上边对JedisPool进行了一下构造, 失败了,也报了一个异常:

    Caused by: java.lang.NoSuchMethodError: redis.clients.jedis.JedisPool: method <init>()V not found
    	at com.redis.monitor.redis.impl.RedisServiceImpl.ping(RedisServiceImpl.java:530)
    	at com.redis.monitor.manager.impl.RedisManagerImpl.ping(RedisManagerImpl.java:190)
    	at com.redis.monitor.web.interceptor.ServerInteceptor.preHandle(ServerInteceptor.java:93)
    	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:891)
    	... 31 more



    这个问题我查了一下,也没搜到个结果来.

    ######如果用 Maven 做项目管理的话,试试 mvn dependency:tree 命令,查查是否有重复的 jedis 依赖######

    引用来自“编走编想”的评论

    类名相同,但是还报 ClassCastException,那原因基本上就是 ClassLoader 不同导致的了
    我也考虑过classloader的问题,但是发现不是classloader的问题######

    谢谢哥, 原来问题是这样的, 我在项目里用到了ant和maven, ant打包的时候会把maven中的那些jar包都放到WEB-INF下的lib文件夹,然后我在eclipse测试测试的时候,虽然是用maven构建的项目,但项目依然会进入lib文件夹读取jar包.

    而我确实升级了一下jedis的版本,从2.1.0->2.7.3,导致有两个jar包依赖.结果2.7.3的类构建的对象又被赋值给2.1.0版本的类声明的变量,结果出错了.

    解决方案就是,我把lib下的包都删掉了. 然后在ant打包的时候,加了删除的内容,保证lib包的内容始终跟开发项目里的内容同步.搞定.

    2020-05-27 10:18:33
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载