Ond*_*kar 11 java amazon-web-services aws-lambda aws-api-gateway
我已经创建了一个Lambda函数,我希望借助API网关通过URL访问它.
我已经完成了所有设置,我还在application/jsonAPI网关中创建了一个体图模板,如下所示:
{
"input": "$input.params('input')",
}
Run Code Online (Sandbox Code Playgroud)
然后我触发HTTP GET请求,如下所示:
https://dmquh95ckh.execute-api.eu-west-1.amazonaws.com/prod/OtoTestFunction?input=test
Run Code Online (Sandbox Code Playgroud)
我的Java处理程序类如下所示:
public class LambdaFunctionHandler implements RequestHandler<String, String> {
@Override
public String handleRequest(String input, Context context) {
context.getLogger().log("Input: " + input);
return "Test completed."+input;
}
}
Run Code Online (Sandbox Code Playgroud)
这是完整的错误消息:
{
"errorMessage": "An error occurred during JSON parsing",
"errorType": "java.lang.RuntimeException",
"stackTrace": [],
"cause": {
"errorMessage": "com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: lambdainternal.util.NativeMemoryAsInputStream@68c4039c; line: 1, column: 1]",
"errorType": "java.io.UncheckedIOException",
"stackTrace": [],
"cause": {
"errorMessage": "Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: lambdainternal.util.NativeMemoryAsInputStream@68c4039c; line: 1, column: 1]",
"errorType": "com.fasterxml.jackson.databind.JsonMappingException",
"stackTrace": [
"com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)",
"com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:835)",
"com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:59)",
"com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:12)",
"com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1441)",
"com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1047)"
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
skv*_*kvp 22
当我将输入参数的类型从String 更改为 Object时,它在所有场景中都对我有用。
public class LambdaFunctionHandler implements RequestHandler<Object, String> {
@Override
public String handleRequest(Object input, Context context) {
String data= input != null ? input.toString() : "{}";
context.getLogger().log("Input: " + data);
return "Test completed."+data;
}
}
Run Code Online (Sandbox Code Playgroud)
************************** 添加于 2021 年 3 月 12 日 ******************* ********
在研究了几个 Lambda 实现之后,我意识到输入参数只不过是 JSON 结构的纯字符串表示或 Map<String, Object> 表示。对于地图表示,Key 是属性的名称,值是 (1) String 如果它是原始值或 (2) List 如果它有多个值,是另一个 Map<String, Object> 或另一个JSON 结构。您可以使用以下方法恢复 JSON 表示:
if(input instanceof String)
{
String lambdaInputJsonStr = (String)input;
}
else if(input instanceof Map)
{
String lambdaInputJsonStr = gson.toJson((Map)input);
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用 Object 作为参数类型以及 Pojo 类,它在某些情况下有效,但在使用 API 网关 URL 从浏览器发出请求时,它失败并给出了上述错误。花了至少 2-3 个小时找出正确的签名,在大多数情况下都可以使用,如下所示。然而,这是 hello world 的示例,您显然可以根据您的要求自定义输入。
public class LambdaFunctionHandler implements RequestHandler<***Map<String,Object>,*** Customer> {
@Override
public Customer handleRequest(***Map<String,Object> input***, Context context) {
}
}
Run Code Online (Sandbox Code Playgroud)
这是Lambda反序列化期间的错误消息。
您的API网关映射模板正在发送JSON对象,但是您的处理程序需要一个String。从API网关发送原始字符串,或更新处理程序以使用与模板输出相对应的POJO。
即
public class MyPojo {
private String input;
public String getInput() { return input; }
public void setInput(String input) { this.input = input; }
}
Run Code Online (Sandbox Code Playgroud)
请参阅:http : //docs.aws.amazon.com/lambda/latest/dg/java-programming-model-req-resp.html
| 归档时间: |
|
| 查看次数: |
6917 次 |
| 最近记录: |