Spring Boot 2.7升级3.0.4后登录POST请求出现NPE错误求助
Spring Boot 2.7升级至3.0.4后登录POST请求500异常排查思路
项目从Spring Boot 2.7升级到3.0.4版本后,常规页面操作均正常,但发送登录POST请求时触发500错误,抛出如下空指针异常,怀疑问题与Spring Observability相关,求排查思路:
2023-03-09 22:16:04,195 ERROR [http-nio-8888-exec-8] [] o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception java.lang.NullPointerException: Cannot invoke "io.micrometer.tracing.CurrentTraceContext$Scope.close()" because the return value of "io.micrometer.tracing.handler.TracingObservationHandler$TracingContext.getScope()" is null at io.micrometer.tracing.handler.TracingObservationHandler.onScopeClosed(TracingObservationHandler.java:115) at io.micrometer.observation.ObservationHandler$FirstMatchingCompositeObservationHandler.lambda$onScopeClosed$5(ObservationHandler.java:163) at java.base/java.util.Optional.ifPresent(Optional.java:178) at io.micrometer.observation.ObservationHandler$FirstMatchingCompositeObservationHandler.onScopeClosed(ObservationHandler.java:163) at io.micrometer.observation.SimpleObservation.lambda$notifyOnScopeClosed$6(SimpleObservation.java:219) at java.base/java.util.ArrayDeque$DescendingIterator.forEachRemaining(ArrayDeque.java:772) at io.micrometer.observation.SimpleObservation.notifyOnScopeClosed(SimpleObservation.java:219) at io.micrometer.observation.SimpleObservation.access$000(SimpleObservation.java:35) at io.micrometer.observation.SimpleObservation$SimpleScope.close(SimpleObservation.java:258) at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.stop(ObservationFilterChainDecorator.java:271) at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:287) at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:170) at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:134) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:143) at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:109) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:741) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) 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.base/java.lang.Thread.run(Thread.java:833)
排查思路
- 对齐依赖版本:检查Spring Boot 3.0.4对应的Micrometer Tracing、Spring Observability版本是否匹配,避免手动指定旧版本导致冲突。Spring Boot 3.0.x默认适配Micrometer Tracing 1.0.x系列,若pom.xml/build.gradle中有自定义版本,需调整为兼容版本。
- 检查TraceContext自定义配置:若项目中自定义了
CurrentTraceContext或Tracing相关Bean,注意Micrometer Tracing 1.0与旧版API不兼容,需适配新版本逻辑,确保Scope能正确初始化。 - 临时禁用Observability验证:在
application.properties中添加management.observability.enabled=false,若登录恢复正常,可确认问题出自Observability模块,再缩小范围排查。 - 检查Spring Security集成逻辑:堆栈显示异常来自Spring Security的
ObservationFilterChainDecorator,排查自定义登录过滤器是否破坏了观测上下文,或是否存在过滤器链顺序问题。 - 清理重复依赖:Spring Boot 3.x已用Micrometer Tracing替代Spring Cloud Sleuth,若同时引入两者会导致冲突,需移除旧的Sleuth依赖。
- 升级Spring Boot版本:该NPE可能是已知bug,尝试升级到3.0.5或更高的3.1.x版本,查看官方是否已修复该问题。
内容的提问来源于stack exchange,提问作者Jasper
相关产品推荐
相关产品推荐

