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不可以,请自行去了解二者的区别。

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

相关推荐
aibo8603088 小时前
基于 Spring Boot 的茶铺管理系统设计与实现
java·spring boot·后端
Thomas.Sir9 小时前
第4课:配置文件详解:application.yml/properties,多环境配置、配置分组、配置校验
java·spring boot
杨运交11 小时前
082-缓存模块-基于 Redis Lua 脚本实现分布式锁与原子操作实战
spring boot
aibo86030812 小时前
基于 Spring Boot + Vue3 的博物馆藏品管理系统设计与实现
java·spring boot·后端
zzu123zsw12 小时前
把条件校验收敛到枚举接口:Spring Boot 统一断言模式与零污染异常切面工程化
java·spring boot·后端·架构设计
鬼手点金12 小时前
单轮对话:最简单的 API 调用
java·服务器·前端·javascript·react.js·servlet·tomcat
code_slave(码畜)13 小时前
微服务架构落地:分库分表实战(下) —— 分布式主键、跨分片查询与分页聚合防坑
数据库·spring boot·分布式·spring cloud·微服务·架构·分库分表
慧都小项13 小时前
图解 MyEclipse Deployment Assembly:资源如何进入部署产物?
java·ide·tomcat·maven·myeclipse·部署排查
zzu123zsw13 小时前
面对多 RPC 扇入超时崩溃:深入 asyncTool 核心 DAG 编排与线程池隔离防护
java·网络·spring boot·网络协议·rpc·并发编程
aibo86030815 小时前
基于 Spring Boot + Vue3 的爱心众筹管理系统设计与实现
java·spring boot·后端