【问题标题】:Error executing "Hello World" for AWS Lambda in Java在 Java 中为 AWS Lambda 执行“Hello World”时出错
【发布时间】:2016-06-03 09:46:22
【问题描述】:

我已经编写了 Hello World Lambda,我通过 AWS toolkit for Eclipse 上传到 AWS 来执行它。

public class HelloWorldLambdaHandler implements RequestHandler<String, String> {
    public String handleRequest(String input, Context context) {
        System.out.println("Hello World! executed with input: " + input);
        return input;
    }
}

执行上述代码时出现以下错误。知道我在这里可能做错了什么吗? BTW Maven 项目具有此处理程序,没有任何其他类,唯一依赖项是 aws-lambda-java-core 版本 1.1.0。

Skip uploading function code since no local change is found...
Invoking function...
==================== FUNCTION OUTPUT ====================
{"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@2f7c7260; 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@2f7c7260; 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)"]}}}

【问题讨论】:

  • 您使用什么有效负载来测试调用?
  • @WillHayworth Payload 是空 JSON 对象 ({})。

标签: amazon-web-services aws-lambda


【解决方案1】:

由于某种原因,亚马逊无法将 json 反序列化为字符串。您可能会认为 String 与输入参数一样通用,但无论对错,它都不兼容。

要处理 JSON,您可以使用 Map 或自定义 POJO。

public class HelloWorldLambdaHandler {
    public String handleRequest(Map<String,Object> input, Context context) {
        System.out.println(input);
        return "Hello";
    }
}

【讨论】:

  • 确实你是对的 - 我用一个没有任何属性的“Person”类替换了 String,它工作正常。
  • 这可能是对的,但为什么会这样呢?有什么解释吗,因为文档本身建议在他们的示例中使用字符串。 AWS 的任何人都可以解释一下吗?
  • 我同意应该改进文档以解释声明为 String 的处理程序输入参数只接受有效的 JSON 字符串(即用引号括起来的 Unicode 序列,例如 "foo")而不是有效 JSON 对象的字符串表示形式(例如 {"foo": "bar"})
  • String 可以工作,只需将您的 json 用引号括起来并转义 json 中的所有引号
  • 输入 Map&lt;String, Object&gt; 和 not Map&lt;String, String&gt; 为我修复了它,即使我发送的是字符串到字符串的 JSON 映射... =/
【解决方案2】:

从堆栈跟踪中读取错误。它说“无法从 START_OBJECT 令牌中反序列化 java.lang.String 的实例”。 “START_OBJECT”标记是“{”。

问题只是你需要传递一个实际的字符串作为输入,例如“一个字符串”。这是您的 json 输入。不是 {}。 {} 不是字符串。您不需要任何大括号,只需要一个字符串(用引号括起来)。另一方面,{} 是一个有效的 Person 对象,因此一旦您将其更改为处理 Person 作为输入,它就可以工作。

【讨论】:

  • @Cenxui 这实际上是问题的正确答案:“知道@Hemnat 在使用空 JSON 对象调用特定 lambda 函数时做错了什么 ({})”
  • 这是正确的答案 - 如果您指定 "{}" 作为您的 Lambda 输入,Lambda 将尝试解析它(即使您的 RequestHandler 输入类型是字符串)。如果你指定""(空字符串),它会起作用。
  • 我绑定使用字符串,它没有工作。 Map 或 person 的上述解决方案为我工作
【解决方案3】:

我在测试中尝试了以下值:

"TestInput"

而不是:

{ Input : "TestInput"}

它似乎运行良好。

【讨论】:

  • 这对我很有帮助。由于这个小问题,我苦苦挣扎了 2 天。
  • 这个解决方案对我有用。显然 AWS 试图将 JSON 格式解析为一个对象。
【解决方案4】:

完整的工作解决方案是

public class HelloWorldLambdaHandler implements RequestHandler<String, String> {
    public String handleRequest(String input, Context context) {
        System.out.println("Hello World! executed with input: " + input);
        return input;
    }
}

然后输入必须用双引号作为字符串 - “测试输入”

【讨论】:

    【解决方案5】:

    测试配置器的输入窗口采用原始 json 或字符串。

    • 如果您传递原始 json,AWS 会将 json 转换为 Map,其中变量名称是映射相应值的键。
    • 如果将 json 用双引号括起来并用内引号分隔,这是 json 对象的可接受的 Java 字符串表示形式,可以照常解析。

    【讨论】:

      【解决方案6】:

      解决方法 1:

      代替

      {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3"
      }
      

      使用一些String作为输入,如下图

      "anyString"
      

      它会正常工作的。

      解决方法2:请参考@Lionel Port 的回答。

      原因:

      正如@Lionel Port 所建议的,您必须在handleRequest() 方法中将String 作为inputType!

      public String handleRequest(String input, Context context) {}
      

      你可以在这里看到,输入类型是字符串并且你正在传递 Json,这就是为什么给出这个错误!

      【讨论】:

        猜你喜欢
        • 2016-08-06
        • 2021-11-01
        • 2017-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-07
        • 1970-01-01
        相关资源
        最近更新 更多