Spring Boot部署AWS Lambda时,Controller注入HttpServletRequest报错:No primary or single unique constructor found for interface jakarta.servlet.http.HttpServletRequest
你碰到的这个问题我之前在做Spring Boot+Lambda项目时也遇到过,本质是Lambda的代理请求模型和Spring MVC原生Servlet模型的适配问题——Lambda用AwsProxyRequest/AwsProxyResponse来封装请求响应,而Spring MVC默认期望的是标准的HttpServletRequest实例,两者之间的转换层没处理好就会报这个错。下面给你几个可行的解决思路:
1. 先确认依赖版本是否匹配(最关键)
如果你用的是Spring Boot 3.x(对应Jakarta Servlet 6.0),必须搭配aws-serverless-java-container-springboot3这个依赖,旧的springboot2版本是不兼容Jakarta包的。比如Maven的配置:
<dependency> <groupId>com.amazonaws.serverless</groupId> <artifactId>aws-serverless-java-container-springboot3</artifactId> <version>2.0.2</version> <!-- 建议用最新稳定版 --> </dependency>
如果是Gradle,对应配置:
implementation 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:2.0.2'
同时检查项目依赖,确保没有同时引入javax.servlet-api(旧版)和jakarta.servlet-api,这会导致类冲突。
2. 替换Controller中HttpServletRequest的使用方式
如果不是必须拿到完整的HttpServletRequest对象,优先用Spring MVC的注解直接获取请求信息,比如请求头、参数、路径变量等,这种方式在Lambda环境下更稳定:
@GetMapping("/current") public ResponseEntity<String> getCurrentUser( @RequestHeader("Authorization") String authHeader, @RequestParam(value = "userId", required = false) String userId ) { // 直接用注解获取需要的内容,不用依赖HttpServletRequest return ResponseEntity.ok().body("Test"); }
如果确实需要完整的请求对象,可以通过Spring的RequestContextHolder来间接获取,绕开直接注入的问题:
@GetMapping("/current") public ResponseEntity<String> getCurrentUser() { // 从上下文获取当前请求 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 在这里使用request对象,比如获取请求头、会话信息等 String userAgent = request.getHeader("User-Agent"); return ResponseEntity.ok().body("Test: " + userAgent); }
3. 检查LambdaHandler的初始化逻辑
你的LambdaHandler代码看起来是标准写法,但要确保TestApplication类是正确的Spring Boot主类(带有@SpringBootApplication注解),并且初始化时没有抛出隐藏的异常。如果初始化过程中容器没正确启动,也会导致请求转换失败。
按照上面的步骤调整后,重新打包部署Lambda,应该就能解决这个构造器找不到的错误了。
备注:内容来源于stack exchange,提问作者speedster_10

