AWS无法从START_OBJECT中反序列化java.lang.String的实例

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)

  • 这几乎正​​是我面临的问题,最终使用:implements RequestHandler&lt;Map&lt;String, Object&gt;, String&gt; 而不是我复制的具有 Map&lt;String, String&gt; 的示例 (4认同)

Vik*_*kky 6

我尝试使用 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)


Rya*_*anG 5

这是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

  • “从API网关发送原始字符串”:如何完成?答案指的是哪个“模板输出”? (3认同)