Spring 4迁移至Spring 6时抛出java.lang.NoClassDefFoundError异常求助
解决Spring 6迁移中
java.lang.NoClassDefFoundError: javax/servlet/Filter异常 问题根源
Spring 6全面切换到Jakarta EE规范,所有Servlet相关API包路径从javax.servlet.*变更为jakarta.servlet.*。你当前配置的com.thetransactioncompany.cors.CORSFilter是适配旧Java EE(javax)的版本,依赖已被移除的javax.servlet.Filter类,因此抛出该异常。
解决方案
1. 替换CORS过滤器为Jakarta兼容版本
使用适配Jakarta EE的CORS过滤器版本,比如com.thetransactioncompany.cors.jakarta.CORSFilter,需确保引入的依赖支持Jakarta规范。
如果用Maven,更新依赖:
<dependency> <groupId>com.thetransactioncompany</groupId> <artifactId>cors-filter</artifactId> <version>2.10</version> <!-- 2.10及以上版本支持Jakarta EE --> </dependency>
2. 修改web.xml中的过滤器配置
将原过滤器的filter-class路径更新为Jakarta兼容类,同时清理重复的过滤器配置(当前配置了两个同实现类的过滤器,属于冗余):
<filter> <filter-name>CorsFilter</filter-name> <filter-class>com.thetransactioncompany.cors.jakarta.CORSFilter</filter-class> <init-param> <param-name>cors.allowed.origins</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>cors.exposed.headers</param-name> <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> </init-param> <init-param> <param-name>cors.allowed.methods</param-name> <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value> </init-param> <init-param> <param-name>cors.allowed.headers</param-name> <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> </init-param> </filter> <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3. 清理旧的javax.servlet依赖残留
检查项目依赖配置(如pom.xml或build.gradle),排除所有javax.servlet相关依赖,确保只有jakarta.servlet的依赖存在:
<!-- 示例:排除Spring依赖中的javax.servlet --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>6.x.x</version> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </exclusion> </exclusions> </dependency>
4. 可选:改用Spring内置CORS支持
Spring 6自带原生CORS配置,无需依赖第三方过滤器,配置更简洁。可以通过XML或Java代码实现:
XML配置方式(spring-web.xml):
<mvc:cors> <mvc:mapping path="/**" allowed-origins="*" allowed-methods="GET,POST,HEAD,OPTIONS,PUT" allowed-headers="Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers" exposed-headers="Access-Control-Allow-Origin,Access-Control-Allow-Credentials"/> </mvc:cors>
配置后可直接移除web.xml中的第三方CORS过滤器。
内容的提问来源于stack exchange,提问作者Raghavender
相关产品推荐
相关产品推荐

