在Java中为AWS Lambda执行"Hello World"时出错

Hem*_*ant 42 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

执行上面的代码时出现以下错误.知道我在这里做错了什么吗?具有此处理程序的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)"]}}}
Run Code Online (Sandbox Code Playgroud)

Lio*_*ort 78

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

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

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

  • 这可能是对的,但为什么会那样?有没有解释,因为文档本身建议在他们的例子中使用String.AWS的任何人都可以解释一下吗? (8认同)
  • 我同意应该改进文档来解释声明为`String`的处理程序输入参数只接受有效的JSON字符串(即用引号括起来的Unicode序列,例如``foo"`)而不是字符串表示形式一个有效的JSON对象(例如`{"foo":"bar"}`) (4认同)
  • 确实你是对的 - 我用一个没有任何属性的“Person”类替换了 String 并且它工作正常。 (2认同)

Kel*_*ehy 14

从堆栈跟踪中读取错误.它说"无法从START_OBJECT标记中反序列化java.lang.String的实例"."START_OBJECT"标记为"{".

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


小智 7

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

"TestInput"
Run Code Online (Sandbox Code Playgroud)

代替 :

{ Input : "TestInput"}
Run Code Online (Sandbox Code Playgroud)

它似乎工作得很好.