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

我已经制作了一个Lambda函数,我想在API网关的帮助下通过URL访问它。

我已经设置好了,我还在API Gateway中创建了一个身体映射模板,如下所示:application/json

{ 
    "input": "$input.params('input')",
}

然后我触发了HTTP GET请求,如下所示:

https://dmquh95ckh.execute-api.eu-west-1.amazonaws.com/prod/OtoTestFunction?input=test

我的 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;
    }
}

这是完整的错误消息:

{
  "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)"
      ]
    }
  }
}

答案 1

当我将输入参数的类型从 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;
  }
}

2021年3月12日添加********************************

在研究了几个 Lambda 实现之后,我意识到输入参数只不过是 JSON 结构或 Map<String、Object> 表示的普通字符串表示形式。对于映射表示形式,Key 是属性的名称,值为 (1) 字符串(如果它是基元值)或 (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);
    }

答案 2

这是 Lambda 反序列化过程中的错误消息。

您的 API 网关 映射模板正在发送 JSON 对象,但您的处理程序需要一个字符串。从 API 网关发送原始字符串,或更新处理程序以使用与模板输出对应的 POJO。

public class MyPojo {
   private String input;
   public String getInput() { return input; }
   public void setInput(String input) { this.input = input; }
}

请参见: http://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-req-resp.html


推荐