使用Postman测试含HttpServletRequest的Spring接口时遇构造器异常求助
Spring Boot接口HttpServletRequest入参报错解决方案
问题场景
编写如下Spring Boot RestController接口,以HttpServletRequest作为入参,使用Postman调用/test接口时抛出构造方法找不到的异常:
控制器代码
@RestController public class MyController { @PostMapping(path = "/test") public ResponseEntity<String> test(HttpServletRequest request) { final String host = request.getRemoteAddr(); final String key = request.getParameter("key"); final String application = request.getParameter("nomeApp"); // 业务逻辑... return ResponseEntity.ok("success"); } }
异常信息
java.lang.IllegalStateException: No primary or single unique constructor found for interface javax.servlet.http.HttpServletRequest at org.springframework.beans.BeanUtils.getResolvableConstructor(BeanUtils.java:266) ~[spring-beans-6.0.4.jar:6.0.4] at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:219) ~[spring-web-6.0.4.jar:6.0.4]
原因分析
- 项目使用Spring Boot 3.x(对应spring-web 6.0.4),该版本已切换到Jakarta EE API,不再兼容旧的
javax.servlet包 - 手动引入的
javax.servlet:servlet-api:2.5依赖与Spring Boot 3.x的Servlet API规范冲突,导致Spring无法识别HttpServletRequest为Servlet原生对象,错误地将其当作普通模型属性尝试实例化,从而抛出构造方法找不到的异常 spring-boot-starter-web已内置适配当前Spring Boot版本的Servlet API依赖,无需手动引入旧版本
解决方案
步骤1:移除冲突的Servlet API依赖
删除pom.xml中以下依赖:
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>
步骤2:调整后的完整依赖示例
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> <!-- Excluded commons-io because of CVE-2021-29425 --> <exclusions> <exclusion> <artifactId>commons-io</artifactId> <groupId>commons-io</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> </dependencies>
步骤3:验证接口调用
修改依赖后重新启动项目,使用Postman调用/test接口,Spring会自动注入HttpServletRequest对象,接口可正常获取请求参数和远程地址等信息。
内容的提问来源于stack exchange,提问作者ErEcTuS
相关产品推荐
相关产品推荐

