AWS Lambda集成API Gateway报错:无匹配GET请求的路由方法
问题分析
你遇到的错误核心原因是API Gateway的资源路径与Spring Controller的请求映射不匹配:
- API Gateway配置的资源路径是
/mmtFunction,所以实际请求URL是https://7ocfwgjy5b.execute-api.us-east-2.amazonaws.com/default/mmtFunction/searchAll - Lambda收到的请求路径是
/mmtFunction/searchAll,但你的Spring Controller只映射了/searchAll,因此找不到对应方法。
另外你尝试的.defaultHttpApiV2Proxy()不适用当前场景,因为你创建的是REST API,而非HTTP API v2,所以该配置无效。
解决方案
以下三种方案任选其一即可解决问题:
方案1:调整API Gateway配置,移除资源前缀
- 登录AWS API Gateway控制台,进入你的
mmtFunction-API - 删除现有的
/mmtFunction资源 - 选择根资源(
/),点击Create Method,选择ANY并保存 - 在集成设置中,选择你的Lambda函数
mmtDemoFunction,保存并确认添加权限 - 重新部署API到
default阶段 - 测试请求URL改为:
https://7ocfwgjy5b.execute-api.us-east-2.amazonaws.com/default/searchAll
方案2:修改Lambda Handler,添加路径前缀映射
修改AWSLambdaHandler的构建代码,指定API Gateway的资源前缀,让Spring自动剥离前缀匹配Controller:
public class AWSLambdaHandler implements RequestStreamHandler { private SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler; public AWSLambdaHandler() throws ContainerInitializationException { handler = (SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse>) new SpringBootProxyHandlerBuilder() .springBootApplication(AWSTestApplication.class) .proxy("/mmtFunction/**") // 匹配API Gateway的资源路径前缀 .asyncInit() .buildAndInitialize(); } @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { handler.proxyStream(inputStream, outputStream, context); } }
重新打包上传Lambda后,原请求URL即可正常访问。
方案3:修改Spring Controller的映射路径
直接在Controller的请求映射中添加/mmtFunction前缀,匹配API Gateway的路径:
@RestController public class AWSTestController { @Autowired private MMTServiceDAO mmtServiceDAO; @CrossOrigin(origins = "*") @GetMapping("/mmtFunction/searchAll") // 添加前缀 public List<MMTData> searchAll() { List<MMTData> dataList = mmtServiceDAO.findAll(); return dataList; } @CrossOrigin(origins = "*") @GetMapping("/mmtFunction/searchDataByMember/{memberno}") // 添加前缀 public List<MMTData> searchDataByMember(@PathVariable Integer memberno) { List<MMTData> dataList = mmtServiceDAO.findDataByMemberNo(memberno); return dataList; } }
重新打包上传Lambda后,原请求URL即可正常访问。
内容的提问来源于stack exchange,提问作者Stella
相关产品推荐
相关产品推荐

