我目前正在尝试转换此javascript示例:
的javascript
'use strict';
exports.handler = (event, context, callback) => {
callback(null, {"speech": "hello lambda js"});
};
从aws lambda中点击测试按钮输出
{
"speech": "hello lambda js"
}
现在我想以最简单的方式将其转换为Java程序。
这就是我的尝试:
public class Sample implements RequestHandler<String, String> {
@Override public String handleRequest(String s, Context context) {
return "{\"speech\": \"hello lambda java\"}";
}
}
但是点击AWS lamda中的测试按钮抱怨:
{
"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@5f375618; 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@5f375618; 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:857)",
"com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:62)",
"com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)",
"com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1511)",
"com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1102)"
]
}
}
}
答案 0 :(得分:1)
您的javascript函数返回的是对象文字,而不是JSON字符串。可能你需要在Java中进行并行操作,这将返回一个类的实例,该类包含一个名为speech的属性,一个用于语音的getter和setter,并且语音的值设置为&#34; hello lambda java& #34 ;. AWS可能会将该对象序列化为您想要的JSON响应。
比Javascript更多地输入Java。哈!我受罚了。
答案 1 :(得分:0)
它确实没有意义,但发送类似&#34; hello&#34;的方法,而不是JSON。 Lambda试图比你更聪明,如果它看到一些看起来像JSON的东西,它会试图解析它。但是你要求一个字符串,所以它会混淆。就个人而言,我认为这是一个错误,但因为你不能通过&#34; Content-Type&#34;它必须猜测。
供参考,如果我使用此代码:
public class HelloWorldLambdaHandler implements RequestHandler<String, String> {
public String handleRequest(String inputObject, Context context) {
context.getLogger().log("context logger - got \"" + inputObject + "\" from call");
return "{\"speech\": \"hello lambda java\"}";
}
}
用字符串测试&#34;你好&#34; (是的,包括引号)我在Lambda测试控制台中得到了我的期望。如果我发送:
{
"key3": "value3",
"key2": "value2",
"key1": "value1"
}
我得到了和你一样的错误。