Spring WebFlux集成Sentry遭遇NoSuchMethodError问题求助
NoSuchMethodError: ServerHttpResponse.getRawStatusCode() 我在Spring WebFlux应用中集成Sentry做错误追踪时遇到以下错误:
java.lang.NoSuchMethodError: org.springframework.http.server.reactive.ServerHttpResponse.getRawStatusCode()Ljava/lang/Integer; at io.sentry.spring.webflux.SentryWebFilter.finishTransaction(SentryWebFilter.java:149) ~[sentry-spring-6.28.0.jar:na] at io.sentry.spring.webflux.SentryWebFilter.lambda$filter$0(SentryWebFilter.java:79) ~[sentry-spring-6.28.0.jar:na] at reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.runFinally(FluxDoFinally.java:156) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.onComplete(FluxDoFinally.java:139) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onComplete(FluxOnAssembly.java:395) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onComplete(FluxOnAssembly.java:395) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onComplete(FluxOnAssembly.java:395) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:189) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:260) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onComplete(Operators.java:1871) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onComplete(FluxOnAssembly.java:395) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:189) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:260) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at org.springframework.http.server.reactive.ChannelSendOperator$WriteCompletionBarrier.onComplete(ChannelSendOperator.java:423) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE] at reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:81) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.onComplete(FluxConcatArray.java:191) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.Operators$MonoSubscriber.onComplete(Operators.java:1679) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.MonoIgnoreThen$ThenAcceptInner.onComplete(MonoIgnoreThen.java:314) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.netty.channel.MonoSendMany$SendManyInner.run(MonoSendMany.java:320) [reactor-netty-0.9.4.RELEASE.jar:0.9.4.RELEASE] at reactor.netty.channel.MonoSendMany$SendManyInner.trySchedule(MonoSendMany.java:383) [reactor-netty-0.9.4.RELEASE.jar:0.9.4.RELEASE] at reactor.netty.channel.MonoSendMany$SendManyInner.trySuccess(MonoSendMany.java:527) [reactor-netty-0.9.4.RELEASE.jar:0.9.4.RELEASE] at reactor.netty.channel.MonoSendMany$SendManyInner.trySuccess(MonoSendMany.java:94) [reactor-netty-0.9.4.RELEASE.jar:0.9.4.RELEASE] at io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48) [netty-common-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.ChannelOutboundBuffer.safeSuccess(ChannelOutboundBuffer.java:717) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:272) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:352) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:414) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:930) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:354) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:897) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1372) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:748) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:740) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:726) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.flush(CombinedChannelDuplexHandler.java:531) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:125) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.CombinedChannelDuplexHandler.flush(CombinedChannelDuplexHandler.java:356) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:748) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:740) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:726) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at reactor.netty.channel.MonoSendMany$SendManyInner$AsyncFlush.run(MonoSendMany.java:633) [reactor-netty-0.9.4.RELEASE.jar:0.9.4.RELEASE] at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:164) [netty-common-4.1.45.Final.jar:4.1.45.Final] at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) [netty-common-4.1.45.Final.jar:4.1.45.Final] at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) [netty-common-4.1.45.Final.jar:4.1.45.Final] at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500) [netty-transport-4.1.45.Final.jar:4.1.45.Final] at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) [netty-common-4.1.45.Final.jar:4.1.45.Final] at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-common-4.1.45.Final.jar:4.1.45.Final] at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-common-4.1.45.Final.jar:4.1.45.Final] at java.lang.Thread.run(Thread.java:750) [na:1.8.0_362-362]
我的配置文件和依赖如下:
application.yml
sentry: dsn: traces-sample-rate: 1.0 debug: true sample-rate: 1 exception-resolver-order: -2147483647 tracing-origins: localhost,^(http|https)://api\\..*$ environment: production
pom.xml
<groupId>com.sample</groupId> <artifactId>sam-doma-con</artifactId> <version>1.0.0</version> <name>sample project</name> <description>Spring Boot </description> <properties> <java.version>1.8</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> <log4j2.version>2.16.0</log4j2.version> <springfox-version>3.0.0</springfox-version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.sentry</groupId> <artifactId>sentry-spring-boot-starter</artifactId> <version>6.28.0</version> </dependency> </dependencies>
我已经尝试过验证版本兼容性、排查依赖冲突、分析堆栈信息,但仍未解决问题。想知道这个ServerHttpResponse.getRawStatusCode()相关的错误该怎么排查和解决?
这个错误的核心原因是Spring Web版本过低:
从堆栈信息可以看到你当前使用的是spring-web-5.2.3.RELEASE,而ServerHttpResponse.getRawStatusCode()方法是在Spring Framework 5.3.0及以上版本才新增的。你使用的Sentry 6.28.0版本依赖了这个方法,所以出现了方法找不到的错误。
解决步骤:
升级Spring Boot版本
Spring Boot 2.4.x及以上版本对应Spring Framework 5.3.x,直接升级Spring Boot版本即可解决这个依赖问题。修改pom.xml中的Spring Boot父依赖(如果没显式声明,需要添加):<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.17</version> <!-- 选择兼容Java 8的最新稳定版,2.7.x是支持Java 8的最后一个分支 --> <relativePath/> </parent>注意:Java 8最高支持Spring Boot 2.7.x版本,如果你想升级到更高版本(如3.x),需要将Java版本升级到17+。
验证依赖版本
执行mvn dependency:tree命令,确认升级后spring-web的版本已经是5.3.x及以上,同时检查是否有其他依赖强制引入了旧版本的Spring Web,如果有需要排除:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </exclusion> </exclusions> </dependency>重新构建项目
执行mvn clean install清理并重新构建项目,启动应用验证错误是否消失。
额外说明
如果你暂时无法升级Spring Boot版本,可以尝试降级Sentry到兼容Spring 5.2.x的版本。Sentry 6.x版本开始要求Spring Framework 5.3+,所以你需要降级到Sentry 5.x版本,比如:
<dependency> <groupId>io.sentry</groupId> <artifactId>sentry-spring-boot-starter</artifactId> <version>5.30.0</version> </dependency>
但不推荐长期使用旧版本,建议优先升级Spring Boot版本以获得更好的兼容性和安全性。
内容的提问来源于stack exchange,提问作者shiva chowdary

