springboot war包tomcat中运行报错,启动过滤器异常,一个或多个筛选器启动失败。

错误信息:

"level": "ERROR",

"thread": "localhost-startStop-1",

"class": "o.a.c.c.C..\[localhost./Crmeb-admin",

"message": "启动过滤器异常" }

java.lang.AbstractMethodError: null

at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)

at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:109)

at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4608)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5258)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)

at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1427)

at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1417)

at java.util.concurrent.FutureTask.run(FutureTask.java:266)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

springboot项目我碰到的问题是jar包运行没错,war包tomcat中运行报这个错误。

可以在tomcat/logs/localhostxxx.log日志文件中找到是哪些过滤器问题。

原因一:

首先确定springboot的版本和对应的内置tomcat版本,是否与下载的tomcat版本一样(一般大版本相同即可),因为不同版本的servlet-api存在兼容问题,下面是servlet与tomcat的版本关系图:

Servlet Spec JSP Spec EL Spec WebSocket Spec Apache Tomcat version Actual release revision Support Java Versions
4.0 TBD (2.4?) TBD (3.1?) TBD (1.2?) 9.0.x None 8 and later
3.1 2.3 3.0 1.1 8.0.x 8.0.15 7 and later
3.0 2.2 2.2 1.1 7.0.x 7.0.57 6 and later (WebSocket 1.1 requires 7 or later)
2.5 2.1 2.1 N/A 6.0.x 6.0.43 5 and later
2.4 2.0 N/A N/A 5.5.x (archived) 5.5.36 (archived) 1.4 and later
2.3 1.2 N/A N/A 4.1.x (archived) 4.1.40 (archived) 1.3 and later
2.2 1.1 N/A N/A 3.3.x (archived) 3.3.2 (archived) 1.1 and later

servlet-api.jar中的Filter接口各版本由差异:

1.早期版本中filter接口的init()、 destroy()方法是普通方法,子类必须实现。

2.中期的init()、 destroy()方法是默认方法,有方法体,子类可不实现。

3.最新版的包名由原来的javax.servlet.xx变成了jakarta.servlet.xx

如果跟tomca/lib/servlet-api.jar不兼容的话就会导致过滤器启动失败、classNotFound、classCast等错误。

原因二:

jar没有打到war中或者java文件没有编译到classs下,可以打开war包看看里面的lib、classs目录是否缺失文件。

原因三:Springboot版本与tomcat版本的兼容问题

  1. Spring Boot 2.x系列

    • Spring Boot 2.x从2.0.x开始默认集成了Tomcat 8.5.x。
    • 2.1.x引入了对Tomcat 9.1的支持。
    • 2.2.x继续支持Tomcat 9.1,并且兼容Tomcat 9.2。
    • 2.3.x及更高版本则默认集成了Tomcat 9.0.53或更高版本。
  2. Spring Boot 3.x系列

    • Spring Boot 3.x从3.0.x开始默认集成了Tomcat 10.x。
    • 具体来说,3.0.x及以上版本默认使用Tomcat 10.x,而早期版本如2.7.x则可能使用Tomcat 9.0.53或更高版本。
  3. 版本兼容性问题

    • 如果Spring Boot与Tomcat版本不匹配,可能会导致启动失败或运行时错误。例如,Spring Boot尝试调用Tomcat中不存在的方法时,会导致NoSuchMethodError错误。
    • 因此,开发者需要确保Spring Boot和Tomcat的版本兼容。如果需要修改内置Tomcat的版本,可以通过修改pom.xml文件中的<tomcat.version>属性来实现

首先需要查看自己的Springboot项目版本

eclipse中选中项目右键选中Properties,然后找到Libraries选项,打开Maven Dependencies,找到Springboot版本,我的是2.2.6版本的。Springboot2.2.6版本的默认对应的tomcat版本为9.0.33。

原因4:过滤器代码问题

原因分析:过滤器找不到tokenComponent绑定,其实就是@Resource注解没有把这个注入,而导致过滤器启动失败,改成@Autowired注入即可。

为什么其他service、controller中没问题呢?因为web应用启动的顺序有关:listener->filter->servlet,filter先于servlet启动。而@Autowired可以@Resource不可以,请自行去了解二者的区别。

经过多次查找,本人的问题是由于原因三和四同时引起的,文中有些内容也是网上查找的,希望能对有同样问题的小伙伴有所帮助。

相关推荐
音符犹如代码14 分钟前
Arthas Profiler 火焰图实战:CPU 热点在哪一目了然
java·jvm·spring boot
大模型丫丫2 小时前
Spring Boot 入门指南:从零开始构建微服务
spring boot·微服务·firefox
Flynt3 小时前
Spring Boot 3开虚拟线程,我把生产服务搞崩了两次
java·spring boot
Full Stack Developme4 小时前
SpringBoot 内嵌 Tomcat 的启动流程
spring boot·后端·tomcat
Full Stack Developme4 小时前
Tomcat 如何处理HTTP请求
java·http·tomcat
用户3126874877201 天前
AI Agent 开发实战(六):用 Spring AI 搭建你的第一个 Agent
spring boot·openai
zhangjw341 天前
第36篇:Spring Boot进阶:Web开发+参数校验+全局异常处理
前端·spring boot·后端
完美火龙篇 四月的友1 天前
SpringBoot 即时聊天 IM 完整实现(HTTP会话管理 \+ WebSocket实时推送 \+ 离线消息)
spring boot·websocket·http
Full Stack Developme1 天前
Tomcat 设计原理
java·tomcat