tomcat websocket类型转换异常:org

at org.apache.coyote.AbstractProtocol A b s t r a c t C o n n e c t i o n H a n d l e r . p r o c e s s ( A b s t r a c t P r o t o c o l . j a v a : 585 ) a t o r g . a p a c h e . t o m c a t . u t i l . n e t . N i o E n d p o i n t AbstractConnectionHandler.process(AbstractProtocol.java:585) at org.apache.tomcat.util.net.NioEndpoint AbstractConnectionHandler.process(AbstractProtocol.java:585)atorg.apache.tomcat.util.net.NioEndpointSocketProcessor.run(NioEndpoint.java:1653)

at java.util.concurrent.ThreadPoolExecutor W o r k e r . r u n T a s k ( T h r e a d P o o l E x e c u t o r . j a v a : 886 ) a t j a v a . u t i l . c o n c u r r e n t . T h r e a d P o o l E x e c u t o r Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor Worker.runTask(ThreadPoolExecutor.java:886)atjava.util.concurrent.ThreadPoolExecutorWorker.run(ThreadPoolExecutor.java:908)

at java.lang.Thread.run(Thread.java:662)

org.apache.coyote.Request无法转换为org.apache.coyote.http11.upgrade.UpgradeInbound

这个异常时有时无,出现的时候也不会影响系统的正常运行。

问题定位

=======================================================================

首先从异常堆栈定位出现异常的源码位置。

at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:842)

at org.apache.coyote.Request.action(Request.java:344)

at org.apache.catalina.connector.Request.doUpgrade(Request.java:2813)

at org.apache.catalina.connector.RequestFacade.doUpgrade(RequestFacade.java:1103)

at org.apache.catalina.websocket.WebSocketServlet.doGet(WebSocketServlet.java:131)

1.org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:842) ,找到源码AbstractHttp11Processor.action842行,this.upgradeInbound = ((UpgradeInbound)param);param转为UpgradeInbound出现类型不匹配。在这里插入图片描述

2.这时看看哪里调用了AbstractHttp11Processor.action。继续看异常堆栈org.apache.coyote.Request.action(Request.java:344),找到org.apache.coyote.Request类第344行:

在这里插入图片描述

343行代码会判断param是否为null,param=null,调用this.hook.action(actionCode, this);第二个参数直接传了一个this,这个this就是org.apache.coyote.Request。从这里就已经看出因为参数param=null,直接把org.apache.coyote.Request本身当作param传给了hook.action(),这个hook就是org.apache.coyote.http11.AbstractHttp11Processor。(AbstractHttp11Processor继承了AbstractProcessorAbstractProcessor实现了接口ActionHook

3.继续深究,什么情况下org.apache.coyote.Request.action(ActionCode actionCode, Object param)的第二个参数param等于null呢?

找到org.apache.catalina.connector.Request.doUpgrade(Request.java:2813)代码位置,可以看到该方法第二个参数UpgradeInbound inbound,也就验证了org.apache.coyote.Request cannot be cast to org.apache.coyote.http11.upgrade.UpgradeInbound

在这里插入图片描述

4.at org.apache.catalina.connector.RequestFacade.doUpgrade(RequestFacade.java:1103)

在这里插入图片描述

5.at org.apache.catalina.websocket.WebSocketServlet.doGet(WebSocketServlet.java:131),从源码可以看到StreamInbound inbound = createWebSocketInbound(subProtocol, wrapper);,源头找到了,就是因为createWebSocketInbound这个方法创建的inbound可能等于null,然后就出现了后面类型转换的问题。

在这里插入图片描述

在这里插入图片描述

protected abstract StreamInbound createWebSocketInbound(String paramString, HttpServletRequest paramHttpServletRequest);

public abstract class StreamInbound

implements UpgradeInbound{…}

createWebSocketInbound是一个静态方法,使用tomcat的webSocket的功能,需要继承org.apache.catalina.websocket.WebSocketServlet,实现createWebSocketInbound,这个跟wesocket三次握手建立连接有关。查看项目代码,自行实现的createWebSocketInbound确实存在返回null的情况。

在这里插入图片描述

原因分析

=======================================================================

在使用tomcat的websocket 功能时,自行实现org.apache.catalina.websocket.WebSocketServlet#createWebSocketInbound有存在返回null的情况,导致后面org.apache.coyote.Request.action(Request.java:344)判断org.apache.coyote.http11.upgrade.UpgradeInbound类型的参数为空时,将自己(this)代替传了进去,从而出现了org.apache.coyote.Request cannot be cast to org.apache.coyote.http11.upgrade.UpgradeInbound的异常。

问题总结

=======================================================================
在使用tomcat的websocket 功能时,继承org.apache.catalina.websocket.WebSocketServlet,自行实现org.apache.catalina.websocket.WebSocketServlet#createWebSocketInbound时不能返回null。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

今天的文章可谓是积蓄了我这几年来的应聘和面试经历总结出来的经验,干货满满呀!如果你能够一直坚持看到这儿,那么首先我还是十分佩服你的毅力的。不过光是看完而不去付出行动,或者直接进入你的收藏夹里吃灰,那么我写这篇文章就没多大意义了。所以看完之后,还是多多行动起来吧!

可以非常负责地说,如果你能够坚持把我上面列举的内容都一个不拉地看完并且全部消化为自己的知识的话,那么你就至少已经达到了中级开发工程师以上的水平,进入大厂技术这块是基本没有什么问题的了。

夹里吃灰,那么我写这篇文章就没多大意义了。所以看完之后,还是多多行动起来吧!

可以非常负责地说,如果你能够坚持把我上面列举的内容都一个不拉地看完并且全部消化为自己的知识的话,那么你就至少已经达到了中级开发工程师以上的水平,进入大厂技术这块是基本没有什么问题的了。

资料领取方式:戳这里前往免费领取

servlet[BookCasdeUpdateServlet]的Servlet.service()引发异常 java.lang.NumberFormatException: For input string: "3}" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.parseInt(Integer.java:615) at servlet.BookCasdeUpdateServlet.doGet(BookCasdeUpdateServlet.java:53) at servlet.BookCasdeUpdateServlet.doPost(BookCasdeUpdateServlet.java:80) at javax.servlet.http.HttpServlet.service(HttpServlet.java:528) at javax.servlet.http.HttpServlet.service(HttpServlet.java:596) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:673) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) 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:748)报错信息
最新发布
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值