我编写了以下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)"]}}}
答案 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或字符串。
答案 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,这就是为什么会出现这个错误!