将AWS Lambda handleRequest中的输入解析为POJO

时间:2018-11-11 20:31:08

标签: java aws-lambda aws-sdk alexa

我正在开发Alexa技能,并且在解析输入事件时Lambda(用Java编写)中存在一些问题。

我的Lamba班就这样

public class AWSLambdaLaunch implements RequestHandler<RequestEnvelope, ResponseEnvelope>{

  @Override
  public ResponseEnvelope handleRequest(RequestEnvelope requestEnvelope, Context context) {
    //...
  }
}

但是我遇到了以下错误

com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.amazon.ask.model.RequestEnvelope]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)\n at [Source: lambdainternal.util.NativeMemoryAsInputStream@543c6f6d; line: 1, column: 2]

No suitable constructor found for type [simple type, class com.amazon.ask.model.RequestEnvelope]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)\n at [Source: lambdainternal.util.NativeMemoryAsInputStream@543c6f6d; line: 1, column: 2]

所以我认为问题是没有办法将输入对象从com.amazon.ask.model.RequestEnvelope解析为RequestEnvelope对象。

我也尝试了com.amazon.ask.dispatcher.request.handler.HandlerInput获得相同的结果。

如果我更改

public class AWSLambdaLaunch implements RequestHandler<RequestEnvelope, ResponseEnvelope>

与此相关的声明

public class AWSLambdaLaunch implements RequestHandler<Map<String, Object>, ResponseEnvelope>

我没有任何错误,并且可以正常工作,但是我发现它更“脏”,无法从嵌套的HashMaps中检索元素和值

所以我想知道是否有一种方法可以直接将输入解析为POJO,或者已经可以使用的POJO。

[edit]这是来自Java aws sdk的RequestEnvelope类的代码。正如@ apandey846指出的那样,该类中没有默认的构造函数,所以也许就是问题所在。有什么我可以使用的方式吗?

[edit]我已经检查了Lambda配置选项卡中是否正确配置了处理程序的完全限定类名,如此处alexa-java-sdk-issue-102所述。我认为issue-104与另一个问题有关,只是因为模板而被引用。

1 个答案:

答案 0 :(得分:0)

这都是我的错。我一直在混淆文档,所以尝试了错误的方法。我只关注了this,现在可以初始化Amazon POJO。

总而言之,我使用的是lambda handlerequest而不是Skill handle。 com.amazon.ask.dispatcher.request.handler.HandlerInput