Spring Boot 3.1+Cloud Functions部署AWS Lambda后URL调用参数为Null
问题分析与解决方案
通过AWS Lambda Function URL调用Spring Cloud Functions开发的函数时参数为null,核心原因是AWS Lambda通过Function URL接收的请求会被包装成标准API Gateway事件结构——即便你设置了Content-Type: text/plain,函数收到的也不是直接的字符串,而是包含body字段的JSON对象,示例结构如下:
{ "body": "Dates", "isBase64Encoded": false, "requestContext": {...}, // 其他附加字段 }
你的Function<String, String>直接期望接收原始字符串,自然无法解析这层包装结构,导致参数为null。而Lambda控制台测试正常,是因为控制台允许直接输入纯文本作为事件,没有经过这层包装。
以下是两种可行的解决方案:
方案一:直接处理API Gateway事件对象
引入AWS Lambda事件依赖,修改函数参数为APIGatewayProxyRequestEvent,手动提取body内容:
- 添加Maven依赖:
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>3.11.0</version> </dependency>
- 修改函数代码:
@SpringBootApplication public class ReverseApplication { public static void main(String[] args) { SpringApplication.run(ReverseApplication.class, args); } @Bean public Function<APIGatewayProxyRequestEvent, String> reverse() { return event -> { String input = event.getBody(); return "Reversed: " + new StringBuilder(input).reverse(); }; } }
方案二:配置Spring Cloud Functions自动映射请求体
通过配置让Spring Cloud Functions AWS适配器自动解析Lambda事件,提取body作为函数参数,无需修改原有函数代码:
在application.properties中添加配置:
spring.cloud.function.adapter.aws.mapping-request=true
配置生效后,你的Function<String, String>代码可以保持不变,适配器会自动将事件中的body字段值传递给函数。
验证curl调用
确保使用正确的curl命令,无需包裹JSON格式内容:
curl -H 'Content-Type: text/plain' <你的Function URL> -d 'Dates'
内容的提问来源于stack exchange,提问作者Jackie Danes
相关产品推荐
相关产品推荐

