【Troubleshooting】SpringBoot应用部署到Tomcat10运行时NPE

【Troubleshooting】SpringBoot应用部署到Tomcat10运行时NPE

1.问题描述

1.1 环境

平台/软件 版本
操作系统 Windows 10 企业版 22H2 19045.4046 64位 / Linux version 4.19.90-2107.6.0.0100.oe1.bclinux.x86_64 (mockbuild@compute1) (gcc version 7.3.0 (GCC))
IDEA 2023.2.4 (Ultimate Edition)
JDK Java HotSpot(TM) 64-Bit Server VM (build 17.0.13+10-LTS-268, mixed mode, sharing) / OpenJDK 64-Bit Server VM (build 17.0.2+8-86, mixed mode, sharing)
Tomcat 10.1.31 / 11.0.2
SpringBoot 3.3.5
Spring 6.1.14

1.2 时间

2024-12-18

1.3 背景

SpringBoot Web应用,之前使用SpringBoot2 + JDK8 + Tomcat8运行正常,现将其升级使用SpringBoot3 + JDK17 + Tomcat10

1.3 现象

升级后,在IDEASpringBootApplication运行正常,构建成war包部署到服务器上的Tomcat中运行出现NPE异常:

image-20241220172637593

2.分析过程

由于该应用并非我开发,一开始仅有日志文件,看日志未看出所以然,于是获取该应用的项目工程在IDEA中进行调试;

在自定义的过滤器类的doFilter方法设置断点,对比2种运行方式的请求所经过的过滤器链:

image-20241220171028023

根据对比发现Tomcat中运行时会多经过ErrorPageFilter,查看其源码得知该过滤器正是如此:

c264865238a638a56f7de3e8701c9e6

3.定位原因

自定义的过滤器代码中对request、response对象进行了一些判断和包装,根据异常产生的代码行调试发现在Tomcat中运行时由于多经过了ErrorPageFilter从而导致未命中判断条件使得response对象为null

image-20241220174651680

4.解决方法

修改自定义的过滤器代码,增加判断条件:

image-20241220174937198

5.经验小结

  • 仔细查看错误消息和异常堆栈,从异常本身出发、勿妄加揣测(本问题的异常出处其实已很明确,由于该应用并非我开发、一开始仅有日志分析、没有看仔细、导致在分析上浪费了较多时间)
  • 能在开发环境IDE中调试的优先在IDE中调试,比如在IDEA中会智能折叠异常堆栈、关键信息较为明显,便于定位问题原因