如何将AWS Lambda中的示例从javascript转换为Java?

时间:2017-07-27 21:11:48

标签: javascript java amazon-web-services aws-lambda

我目前正在尝试转换此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)"
      ]
    }
  }
}

2 个答案:

答案 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"
}

我得到了和你一样的错误。