Amazon web services 执行错误";“你好,世界”;用于Java中的AWS Lambda

Amazon web services 执行错误";“你好,世界”;用于Java中的AWS Lambda,amazon-web-services,aws-lambda,Amazon Web Services,Aws Lambda,我已经编写了以下Hello World Lambda,我正在通过AWS Eclipse工具包上传到AWS上执行它 public class HelloWorldLambdaHandler implements RequestHandler<String, String> { public String handleRequest(String input, Context context) { System.out.println("Hello World!

我已经编写了以下Hello World Lambda,我正在通过AWS 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;
    }
}

出于某种原因,Amazon无法将json反序列化为字符串。您可能会认为字符串和输入参数一样通用,但不管对错,它都不兼容

要处理JSON,可以使用映射或自定义POJO

public class HelloWorldLambdaHandler {
    public String handleRequest(Map<String,Object> input, Context context) {
        System.out.println(input);
        return "Hello";
    }
}
公共类HelloWorldLambdaHandler{
公共字符串handleRequest(映射输入、上下文){
系统输出打印项次(输入);
回复“你好”;
}
}

从堆栈跟踪读取错误。它说“不能反序列化START_对象令牌之外的java.lang.String实例”。“START_OBJECT”标记是“{”


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

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

"TestInput"
而不是:

{ Input : "TestInput"}

而且它似乎工作得很好。

完整的工作解决方案是

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;
    }
}
公共类HelloWorldLambdaHandler实现RequestHandler{
公共字符串handleRequest(字符串输入,上下文){
System.out.println(“helloworld!使用输入执行:”+input);
返回输入;
}
}

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

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

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

解决方案1:

而不是

{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}
使用一些字符串作为输入,如下所示

"anyString"
它会很好用的

解决方案2:请参考@Lionel Port的答案

原因:

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


您可以在这里看到,输入类型是String,您正在传递Json,这就是为什么会出现此错误!

您使用什么负载来测试调用?@WillHayworth payload是空的Json对象({})。事实上,您是对的-我将String替换为“Person”类,该类没有任何属性,并且工作正常。这可能是对的,但为什么会是这样?是否有任何解释,因为文档本身建议在示例中使用字符串。AWS中的任何人都可以解释这一点吗?我同意文档应该改进,以解释处理程序输入参数声明为
String
仅接受有效的JSON字符串(即,由引号包围的Unicode序列,例如
“foo”
),而不接受有效JSON对象的字符串表示形式(例如
{“foo”:“bar”}
)字符串确实有效,只需将json用引号括起来,并转义json中的所有引号。输入
Map
,而不是
Map
为我修复了它,即使我将字符串的json映射发送到字符串…=/@Cenxui这实际上是问题的正确答案:“知道@Hemnat在使用空JSON对象(
{}
)调用特定lambda函数时做错了什么吗?”这是正确的答案-如果指定
“{}”
作为lambda输入,lambda将尝试解析它(即使RequestHandler输入类型是String)。如果指定
(空字符串)相反,它是有效的。我绑定到使用字符串,但它不起作用。上面的地图或为meThis工作的人的解决方案确实帮助了我。我因为这个小问题挣扎了两天。这个解决方案对我有效。显然AWS试图将JSON格式解析为一个对象。
"anyString"
public String handleRequest(String input, Context context) {}