执行错误" Hello World"适用于Java中的AWS Lambda

时间:2016-02-22 04:04:04

标签: amazon-web-services aws-lambda

我编写了以下Hello World Lambda,我正在AWS上通过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 version 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)"]}}}

6 个答案:

答案 0 :(得分:70)

由于某些原因,亚马逊无法将json反序列化为String。您会认为String会像输入参数一样通用,但正确或错误地说它不兼容。

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

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

答案 1 :(得分:13)

从堆栈跟踪中读取错误。它表示&#34;无法从START_OBJECT标记&#34;中反序列化java.lang.String的实例。 &#34; START_OBJECT&#34;令牌是&#39; {&#39;。

问题只是你需要传递一个实际的String作为输入,例如&#34;一个字符串&#34;。这是你的json输入。不是{}。 {}不是String。你不需要任何大括号,只需要一个字符串(引号)。另一方面,{}是一个有效的Person对象,所以一旦你改变它就可以处理Person作为输入。

答案 2 :(得分:7)

我在测试中尝试使用以下值:

"TestInput"

而不是:

{ Input : "TestInput"}

看起来效果很好。

答案 3 :(得分:2)

完整的解决方案是

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

解决方法 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,这就是为什么会出现这个错误!