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 分钟前
Spring Boot的GraalVM支持:构建低资源消耗微服务
spring boot·python·微服务
在未来等你1 小时前
互联网大厂Java面试:从Spring到微服务的技术探讨
数据库·spring boot·微服务·java面试·技术栈·互联网大厂
青铜锁001 小时前
Ubuntu系统下Firefox浏览器完整指南:故障修复、国内版安装与下载加速
ubuntu·firefox
橘猫云计算机设计4 小时前
springboot基于推荐算法的景点推荐系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·毕业设计·推荐算法
维基框架5 小时前
Spring Boot Jpa封装快速构建Specification、OrderBy、Pageable的查询条件
java·spring boot
等什么君!5 小时前
学习springboot-条件化配置@Conditional(条件注解)
java·spring boot·学习
武昌库里写JAVA7 小时前
【iview】icon样式
java·开发语言·spring boot·学习·课程设计
颇有几分姿色8 小时前
Spring Boot 实现多种来源的 Zip 多层目录打包下载(本地文件&HTTP混合)
java·spring boot·后端
计算机毕设指导610 小时前
基于Springboot旅游网站系统【附源码】
java·开发语言·spring boot·后端·mysql·spring·旅游