错误代码
ClassCastException问题
java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast to jakarta.servlet.Filter
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:250)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:102)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4562)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5205)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
Error during artifact deployment
17-Oct-2021 15:27:32.564 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到
17-Oct-2021 15:27:32.565 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 由于之前的错误,Context[/MallDemo_war]启动失败
[2021-10-17 03:27:32,591] Artifact MallDemo:war: Error during artifact deployment. See server log for details.
web.xml 配置
<web-app>
<display-name>Archetype Created Web Application</display-name>
<filter>
<filter-name>charEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
问题分析
因为Tomcat 10使用的是 jakarta.**
(Jakarta EE 9)的包,然而SpringFramework中的CharacterEncodingFilter类基于javax.**
包(Java EE 8),所以会导致类型转换不过去
解决办法
- 使用 Tomcat 9.x
- Use https://github.com/apache/tomcat-jakartaee-migration to migrate the Wicket application (the .war file) from javax to jakarta
- Deploy the
javax.**
based application into$TOMCAT10_HOME/webapps-javaee/
folder. It will be automatically migrated tojakarta.**
by Tomcat.