Dropwizard与Jetty版本兼容问题:ClassCastException异常排查求助
解决java.lang.ClassCastException: BiDiGzipHandler$WrappedServletRequest无法转为org.eclipse.jetty.server.Request
问题背景
使用Dropwizard 1.1.2 和 jetty-server 9.4.2.v20170220,客户端未设置编码请求头时出现类型转换异常,完整堆栈如下:
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) ! at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533) ! at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255) ! at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1317) ! at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203) ! at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473) ! at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201) ! at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1219) ! at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144) ! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) ! at com.codahale.metrics.jetty9.InstrumentedHandler.handle(InstrumentedHandler.java:241) ! at io.dropwizard.jetty.RoutingHandler.handle(RoutingHandler.java:52) ! at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:674) ! at io.dropwizard.jetty.BiDiGzipHandler.handle(BiDiGzipHandler.java:64)
问题原因
- 代码中直接将
HttpServletRequest强制转换为Jetty原生的org.eclipse.jetty.server.Request,但请求经过Dropwizard的BiDiGzipHandler时会被包装成BiDiGzipHandler$WrappedServletRequest,该包装类并未继承Jetty的Request类,导致强转失败。 - Dropwizard 1.1.2默认依赖Jetty 9.3.x系列,手动指定的9.4.2版本与Dropwizard的Handler链逻辑存在兼容性差异,进一步触发了该异常。
解决方案
避免直接强转Jetty原生Request
改用Jetty提供的工具类从请求包装链中提取原生实例,替代强制转换:import org.eclipse.jetty.server.Request; // 正确获取Jetty原生Request的方式 Request jettyRequest = Request.getRequest(httpServletRequest);对齐版本依赖
Dropwizard 1.1.2官方适配Jetty 9.3.x,不要随意升级Jetty版本。若必须使用Jetty 9.4,建议将Dropwizard升级到1.3.x及以上版本(官方从1.3开始支持Jetty 9.4)。检查GzipHandler配置
确保应用中没有重复配置Gzip相关Handler,避免多层请求包装加剧类型转换问题。
内容的提问来源于stack exchange,提问作者mat_vee
相关产品推荐
相关产品推荐

