使用reactor-core与reactor-netty-http时遇ContextView类未找到异常
解决java.lang.NoClassDefFoundError: reactor/util/context/ContextView异常
问题分析
你遇到的运行时类找不到异常,核心原因是编译时类路径存在该类,但运行时类路径缺失或依赖版本不兼容。虽然IDE中能找到ContextView类,但实际运行时,要么是依赖冲突导致加载了旧版本的reactor-core,要么是打包过程中遗漏了该类,或者手动指定的依赖版本和Spring Boot默认管理的版本不匹配。
解决方案
1. 移除手动指定的reactor依赖,依赖Spring Boot版本管理
spring-boot-starter-webflux已经内置了兼容版本的reactor-core和reactor-netty-http,手动指定版本极易引发冲突。修改你的build.gradle配置:
implementation ("org.springframework.boot:spring-boot-starter-webflux") implementation ("org.springframework.boot:spring-boot-starter-web") { exclude (group: "io.netty", module: "netty-codec-http") exclude (group: "io.netty", module: "netty-handler") } // 移除以下两行手动指定的依赖 // implementation ("io.projectreactor.netty:reactor-netty-http:1.0.9") // implementation ("io.projectreactor:reactor-core:3.4.14")
Spring Boot会自动引入一套完全兼容的reactor全家桶版本,从根源避免版本不匹配问题。
2. 若必须手动指定版本,严格匹配兼容性
如果因特殊需求必须手动指定版本,要确保reactor-netty和reactor-core的版本严格对应。根据Reactor官方版本矩阵:
reactor-netty-http:1.0.9属于Dysprosium SR9版本列车,对应的reactor-core版本确实是3.4.14,但需排查是否有其他依赖引入了旧版本的reactor-core。
执行以下命令排查依赖冲突:
./gradlew dependencies | grep reactor-core
如果发现旧版本reactor-core被引入,在对应依赖中排除:
// 示例:排除某依赖中的旧版reactor-core implementation ("xxx:xxx:1.0") { exclude group: "io.projectreactor", module: "reactor-core" }
3. 检查打包配置是否遗漏类
如果是打包后运行出现问题,检查打包插件(如shadowJar)是否正确包含reactor-core的所有类,确保配置中没有排除reactor.util.context包下的类。
4. Gzip压缩配置补充
你当前的WebClient配置已经正确开启了gzip压缩(HttpClient.create().compress(true)),同时设置了Accept-Encoding: gzip请求头,这部分逻辑没有问题,解决异常后即可正常处理chunked编码的gzip响应。
内容的提问来源于stack exchange,提问作者fernando-ta
相关产品推荐
相关产品推荐

