升级Spring Web MVC 6.2.5后RequestDataValueProcessor实现类编译报错求助
问题:Spring Web MVC升级后RequestDataValueProcessor实现类编译报错
问题概述
为修复漏洞将Spring Web MVC从5.3.22版本升级至6.2.5版本后,编译应用时出现以下错误:
error: CSRFRequestDataValueProcessor is not abstract and does not override abstract method processUrl(HttpServletRequest,String) in RequestDataValueProcessor public class CSRFRequestDataValueProcessor implements RequestDataValueProcessor { error: method does not override or implement a method from a supertype [javac] @Override
该错误在Spring Web MVC 5.3.22版本中未出现,且代码已实现RequestDataValueProcessor接口的所有方法,代码如下:
import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.web.servlet.support.RequestDataValueProcessor; public class CSRFRequestDataValueProcessor implements RequestDataValueProcessor { @Override public String processFormFieldValue(HttpServletRequest request, String name, String value, String type) { return value; } @Override public Map<String, String> getExtraHiddenFields(HttpServletRequest request) { Map<String, String> hiddenFields = new HashMap<String, String>(); hiddenFields.put(CSRFTokenManager.CSRF_PARAM_NAME, CSRFTokenManager.getTokenForSession(request.getSession())); return hiddenFields; } @Override public String processUrl(HttpServletRequest request, String url) { return url; } @Override public String processAction(HttpServletRequest request, String action,String httpMethod) { return action; } }
项目当前依赖的相关Spring包:
- spring-security-config-5.7.2
- spring-security-core-5.7.2
- spring-security-web-5.7.2
- spring-integration-security-5.5.14
- spring.web.servlet-3.1.1
问题原因
- Jakarta EE 迁移不兼容:Spring Web MVC 6.x基于Jakarta EE 9+规范,所有
javax.servlet相关API已替换为jakarta.servlet包,而代码仍在使用旧的javax.servlet.http.HttpServletRequest,导致与Spring 6.x中RequestDataValueProcessor接口的方法签名不匹配,编译器判定未正确实现接口方法。 - 依赖版本冲突:项目中存在旧版
spring.web.servlet-3.1.1依赖,会引入旧的javax.servlet类,与Spring 6.x的jakarta.servlet类产生类路径冲突。 - Spring生态版本不匹配:Spring Security 5.7.x与Spring 6.x不兼容,Spring 6.x需要搭配Spring Security 6.0+版本,版本错位会进一步加剧类定义冲突。
解决方案
修改代码导入包
将代码中的import javax.servlet.http.HttpServletRequest;替换为:import jakarta.servlet.http.HttpServletRequest;清理冲突依赖
移除旧版spring.web.servlet-3.1.1依赖,Spring Web MVC 6.2.5已包含对应的web模块,无需单独引入旧版依赖。升级Spring生态依赖版本
将Spring Security及Spring Integration相关依赖升级至适配Spring 6.x的版本(建议与Spring Web MVC版本保持一致,即6.2.5):- spring-security-config-6.2.5
- spring-security-core-6.2.5
- spring-security-web-6.2.5
- spring-integration-security-6.2.5
确认Servlet API依赖
确保项目中引入的是Jakarta EE的Servlet API(版本5.0+),替换原有的javax.servlet相关依赖,例如Maven中可引入:<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency>
内容的提问来源于stack exchange,提问作者RithanyaLaxmi
相关产品推荐
相关产品推荐

