错误信息:
"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版本的兼容问题
-
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或更高版本。
-
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或更高版本。
-
版本兼容性问题:
- 如果Spring Boot与Tomcat版本不匹配,可能会导致启动失败或运行时错误。例如,Spring Boot尝试调用Tomcat中不存在的方法时,会导致
NoSuchMethodError
错误。 - 因此,开发者需要确保Spring Boot和Tomcat的版本兼容。如果需要修改内置Tomcat的版本,可以通过修改
pom.xml
文件中的<tomcat.version>
属性来实现
- 如果Spring Boot与Tomcat版本不匹配,可能会导致启动失败或运行时错误。例如,Spring Boot尝试调用Tomcat中不存在的方法时,会导致
首先需要查看自己的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不可以,请自行去了解二者的区别。
经过多次查找,本人的问题是由于原因三和四同时引起的,文中有些内容也是网上查找的,希望能对有同样问题的小伙伴有所帮助。