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

【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 现象
升级后,在IDEA
中SpringBootApplication
运行正常,构建成war
包部署到服务器上的Tomcat
中运行出现NPE
异常:
2.分析过程
由于该应用并非我开发,一开始仅有日志文件,看日志未看出所以然,于是获取该应用的项目工程在IDEA
中进行调试;
在自定义的过滤器类的doFilter
方法设置断点,对比2种运行方式的请求所经过的过滤器链:
根据对比发现Tomcat
中运行时会多经过ErrorPageFilter
,查看其源码得知该过滤器正是如此:
3.定位原因
自定义的过滤器代码中对request、response
对象进行了一些判断和包装,根据异常产生的代码行调试发现在Tomcat
中运行时由于多经过了ErrorPageFilter
从而导致未命中判断条件使得response
对象为null
:
4.解决方法
修改自定义的过滤器代码,增加判断条件:
5.经验小结
- 仔细查看错误消息和异常堆栈,从异常本身出发、勿妄加揣测(本问题的异常出处其实已很明确,由于该应用并非我开发、一开始仅有日志分析、没有看仔细、导致在分析上浪费了较多时间)
- 能在开发环境IDE中调试的优先在IDE中调试,比如在IDEA中会智能折叠异常堆栈、关键信息较为明显,便于定位问题原因
评论
匿名评论隐私政策