AWS Lambda Function URLs Java接收JSON输入遇JSON解析异常
解决AWS Lambda Function URL POST请求JSON解析异常
问题原因
当使用AWS Lambda Function URL触发函数时,Lambda默认会将POST请求封装为APIGatewayV2HTTPEvent格式的JSON对象传递给函数,但你的代码声明输入类型为Map<String, String>、输出类型为String,这会导致:
- Lambda尝试将复杂的APIGatewayV2HTTPEvent对象反序列化为
Map<String, String>,触发类型不匹配的反序列化错误; - 返回的
String会被Lambda当作JSON进行解析,若返回内容不是合法JSON格式,也会引发后续解析问题。
解决方案
方案1:适配Function URL的事件格式(推荐)
修改函数的输入输出类型为Function URL专用的事件类,同时正确处理请求体和响应格式:
- 添加依赖
在项目构建文件中引入aws-lambda-java-events依赖(以Maven为例):
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>3.11.0</version> <!-- 使用最新稳定版本 --> </dependency>
- 修改Lambda代码
import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.APIGatewayV2HTTPEvent; import com.amazonaws.services.lambda.runtime.events.APIGatewayV2HTTPResponse; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.HashMap; import java.util.Map; public class PiiDecryptionLambda implements RequestHandler<APIGatewayV2HTTPEvent, APIGatewayV2HTTPResponse> { private static final ObjectMapper objectMapper = new ObjectMapper(); @Override public APIGatewayV2HTTPResponse handleRequest(APIGatewayV2HTTPEvent request, Context context) { try { // 解析POST请求体为Map Map<String, String> requestData = objectMapper.readValue(request.getBody(), Map.class); context.getLogger().log("inside the lambda and the data is :" + requestData); // 构造标准HTTP响应 APIGatewayV2HTTPResponse response = new APIGatewayV2HTTPResponse(); response.setStatusCode(200); // 设置响应头为JSON格式 Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); response.setHeaders(headers); // 返回JSON格式的响应内容 response.setBody(objectMapper.writeValueAsString(Map.of("name", requestData.get("name")))); return response; } catch (Exception e) { context.getLogger().log("Error processing request: " + e.getMessage()); // 构造错误响应 APIGatewayV2HTTPResponse errorResponse = new APIGatewayV2HTTPResponse(); errorResponse.setStatusCode(500); errorResponse.setBody("{\"error\": \"Failed to process request\"}"); return errorResponse; } } }
方案2:配置Function URL为RAW负载格式
如果不想修改代码,可以将Function URL的有效负载格式改为RAW,让Lambda直接接收原始请求体:
- 进入AWS Lambda控制台,找到目标函数;
- 切换到配置标签页,选择函数URL;
- 点击编辑,在有效负载格式下拉框中选择
RAW,保存更改。
此时需要确保:
- POST请求的
Content-Type为application/json; - 请求体是合法的JSON对象(例如
{"name": "test"}); - 函数返回的
String是合法JSON格式(例如返回"{\"name\":\"" + requestData.get("name") + "\"}"),或者修改返回类型为Map,让Lambda自动序列化为JSON。
验证步骤
- 重新部署修改后的Lambda函数;
- 发送POST请求,确保请求头包含
Content-Type: application/json,请求体为合法JSON对象; - 查看Lambda日志,确认请求数据正常解析,响应返回正确。
内容的提问来源于stack exchange,提问作者Santosh Keleti
相关产品推荐
相关产品推荐

