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

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

相关推荐
爱码猿2 分钟前
Springboot结合thymeleaf模板生成pdf文件
spring boot·后端·pdf
Coder_Boy_1 小时前
基于SpringAI的在线考试系统软件系统验收案例
人工智能·spring boot·软件工程·devops
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 小时前
List、Set的相似性
windows·tomcat·list
qq_12498707531 小时前
基于SSM框架的智能密室逃脱信息管理系统(源码+论文+部署+安装)
java·大数据·人工智能·spring boot·后端·毕业设计·计算机毕业设计
用户2190326527352 小时前
Spring Boot Admin终极监控方案:从零搭建企业级微服务监控平台,含高可用集群配置
spring boot·微服务·监控
守城小轩2 小时前
深度解析 Firefox 144+ 编译架构(五)深入解析 Bootstrap 引导模式
firefox·浏览器自动化·指纹浏览器·浏览器开发
咕叽咕叽的汪3 小时前
Es/Kibana7.17.9中数据迁移到openSearch3.4.0【DockerDesktop模拟】
运维·spring boot·elasticsearch·docker·容器·devops
千寻技术帮3 小时前
10340_基于Springboot的游戏网站
spring boot·后端·游戏·vue·商城
xiaoliuliu123453 小时前
apache-tomcat-6.0.10使用步骤详解(附启动与部署教程)
java·tomcat·apache
WX-bisheyuange3 小时前
基于SpringBoot的诊疗预约平台
java·spring boot·后端·毕业设计