Amazon web services 执行错误";“你好,世界”;用于Java中的AWS Lambda
我已经编写了以下Hello World Lambda,我正在通过AWS Eclipse工具包上传到AWS上执行它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!
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字符串表示形式,可以像往常一样进行解析
{
"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) {}