将 AWS Lambda handleRequest 中的输入解析为 POJO
Parsing the input in a AWS Lambda handleRequest into a POJO
我正在开发 Alexa Skill,在解析输入事件时,我在 Lambda(写在Java)中遇到了一些问题。
我的兰巴class是这样的
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>
我没有收到任何错误并且工作正常,但我发现它更多 "dirty" 从嵌套的 HashMaps
中检索元素和值
所以我想知道是否有一种方法可以直接将输入解析为 POJO,或者是否有我可以使用的已经构建的 POJO。
[edit] 这是来自 java aws sdk 的 RequestEnvelope class 的代码。正如 @apandey846 所指出的,class 中没有默认构造函数,所以这可能就是问题所在。有什么办法可以使用吗?
[edit] 我已经检查过在 Lambda 配置选项卡中正确配置了处理程序的完全限定 class 名称,如此处所述 alexa-java-sdk-issue-102. I think issue-104 是关于另一个问题,但只是因为模板。
都是我的错。我一直在混淆文档,所以我尝试了错误的方法。我只关注了this,现在我可以初始化一个Amazon POJO了。
总而言之,我使用的是 lambda handlerequest 而不是 skill handle。 com.amazon.ask.dispatcher.request.handler.HandlerInput
我正在开发 Alexa Skill,在解析输入事件时,我在 Lambda(写在Java)中遇到了一些问题。
我的兰巴class是这样的
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>
我没有收到任何错误并且工作正常,但我发现它更多 "dirty" 从嵌套的 HashMaps
中检索元素和值所以我想知道是否有一种方法可以直接将输入解析为 POJO,或者是否有我可以使用的已经构建的 POJO。
[edit] 这是来自 java aws sdk 的 RequestEnvelope class 的代码。正如 @apandey846 所指出的,class 中没有默认构造函数,所以这可能就是问题所在。有什么办法可以使用吗?
[edit] 我已经检查过在 Lambda 配置选项卡中正确配置了处理程序的完全限定 class 名称,如此处所述 alexa-java-sdk-issue-102. I think issue-104 是关于另一个问题,但只是因为模板。
都是我的错。我一直在混淆文档,所以我尝试了错误的方法。我只关注了this,现在我可以初始化一个Amazon POJO了。
总而言之,我使用的是 lambda handlerequest 而不是 skill handle。 com.amazon.ask.dispatcher.request.handler.HandlerInput