Aws lambda AWS Lex接收到来自lambda函数的无效响应-无法构造IntentResponse的实例

Aws lambda AWS Lex接收到来自lambda函数的无效响应-无法构造IntentResponse的实例,aws-lambda,amazon-lex,Aws Lambda,Amazon Lex,在EclipseAWS SDK中使用Java8,我创建并上传了一个lambda函数,该函数在实现我的lex意图时被挂接。 Lambda在接收JSON请求和解析方面没有问题。 然后,我格式化一个简单的“Close”dialogAction响应并发送回lex,并从lex控制台的Test Bot页面接收以下错误: An error has occurred: Received invalid response from Lambda: Can not construct instan

在EclipseAWS SDK中使用Java8,我创建并上传了一个lambda函数,该函数在实现我的lex意图时被挂接。 Lambda在接收JSON请求和解析方面没有问题。 然后,我格式化一个简单的“Close”dialogAction响应并发送回lex,并从lex控制台的Test Bot页面接收以下错误:

    An error has occurred: Received invalid response from Lambda: 
    Can not construct instance of IntentResponse: 
    no String-argument constructor/factory method to deserialize 
    from String value
    ('{"dialogAction
    {"type":"Close","fulfillmentState":"Fulfilled","message":
    {"contentType":"PlainText","content":"Thanks I got your info"}}}') 
    at [Source: "{\"dialogAction\":
    {\"type\":\"Close\",\"fulfillmentState\":\"Fulfilled\",\"message\":
   {\"contentType\":\"PlainText\",\"content\":\"Thanks I got your 
   info\"}}}";line: 1, column: 1]
格式(第1行第1列)似乎马上就有问题,但我的JSON字符串看起来没问题。在handleRequest java函数中返回输出字符串之前,我正在将其写入Cloudwatch日志,其写入方式如下:

我尝试过的事情:

  • 删除消息元素,因为它不是必需的
  • 添加非必需的属性,如sessionAttributes, 应答卡等
  • 删除双引号
  • 用单引号替换双引号
  • 从文档中的示例响应格式消息硬编码json

在http头级别是否有隐藏的东西,或者java8是否对JSON做了不可见的事情

不确定这是否是因为我使用的是Java8,但RequestHandler类HandlerRequest方法的返回值“String”将不起作用。 是的,String是一个对象,但是Lex端的构造函数需要一个“对象”。在handleRequest方法中返回lex response POJO之前,我将其转换为字符串。那是我的错误

我通过将handleRequest方法的返回类型更改为“Object”而不是“String”来修复它。

public Object handleRequest(Object input, Context context)
而不是

public String handleRequest(Object input, Context context) 
您还必须实现

 public class LambdaFunctionHandler implements RequestHandler<Object, Object>
public类LambdaFunctionHandler实现RequestHandler
不是

public类LambdaFunctionHandler实现RequestHandler

这解决了我的问题

不确定这是否是因为我使用的是Java8,但RequestHandler类HandlerRequest方法的返回值“String”将不起作用。 是的,String是一个对象,但是Lex端的构造函数需要一个“对象”。在handleRequest方法中返回lex response POJO之前,我将其转换为字符串。那是我的错误

我通过将handleRequest方法的返回类型更改为“Object”而不是“String”来修复它。

public Object handleRequest(Object input, Context context)
而不是

public String handleRequest(Object input, Context context) 
您还必须实现

 public class LambdaFunctionHandler implements RequestHandler<Object, Object>
public类LambdaFunctionHandler实现RequestHandler
不是

public类LambdaFunctionHandler实现RequestHandler

这解决了我的问题

在我的例子中,我面临着完全相同的问题,并且能够通过创建特定的响应POJO类型并使用此POJO作为“handleRequest”方法的返回类型来修复它。例如,BotResponse.java如下:

public class BotResponse implements Serializable{
    private static final long serialVersionUID = 1L;

    public DialogAction dialogAction = new DialogAction();

    public DialogAction getDialogAction() {
        return dialogAction;
    }

    public void setDialogAction(DialogAction dialogAction) {
        this.dialogAction = dialogAction;
    }
}
注意,为了安全起见,我还添加了“implements Serializable”。也许这是一种过度的杀伤力。
不知道为什么,但对我来说,即使将“HandlerRequest”方法的返回类型更改为“object”,返回格式良好的JSON字符串对象也不起作用。

在我的例子中,我遇到了完全相同的问题,并且能够通过创建特定的响应POJO类型并使用此POJO作为“HandlerRequest”方法的返回类型来修复它。例如,BotResponse.java如下:

public class BotResponse implements Serializable{
    private static final long serialVersionUID = 1L;

    public DialogAction dialogAction = new DialogAction();

    public DialogAction getDialogAction() {
        return dialogAction;
    }

    public void setDialogAction(DialogAction dialogAction) {
        this.dialogAction = dialogAction;
    }
}
注意,为了安全起见,我还添加了“implements Serializable”。也许这是一种过度的杀伤力。
不知道为什么,但对我来说,即使将“handleRequest”方法的返回类型更改为“object”,返回格式良好的JSON字符串对象也不起作用。

我知道这是一个老问题,但我认为这可能对其他人有所帮助

@Mattbob解决方案无法解决我的问题,但他走的是正确的道路。最好的方法是使用一个响应对象,一个自定义响应对象,并使lambda返回自定义响应对象。因此,我查阅了文档并创建了一个自定义对象,它看起来像是响应格式

在回答问题时,我在SDK中找不到与响应对象匹配的对象,因此我不得不重新创建,但如果有人知道,请在下面发表评论

 Class xxxxx implements RequestHandler<Object, AccountResponse> {

@Override
public AccountResponse handleRequest(Object input, Context context) {
类xxxxx实现RequestHandler{ @凌驾 public AccountResponse HandlerRequest(对象输入、上下文){ } }


Lambda看起来有点像这样,只需填充并返回对象以匹配响应结构,错误就会消失。希望这能有所帮助。

我知道这是一个老问题,但我认为这可能会对其他人有所帮助

@Mattbob解决方案无法解决我的问题,但他走的是正确的道路。最好的方法是使用一个响应对象,一个自定义响应对象,并使lambda返回自定义响应对象。因此,我查阅了文档并创建了一个自定义对象,它看起来像是响应格式

在回答问题时,我在SDK中找不到与响应对象匹配的对象,因此我不得不重新创建,但如果有人知道,请在下面发表评论

 Class xxxxx implements RequestHandler<Object, AccountResponse> {

@Override
public AccountResponse handleRequest(Object input, Context context) {
类xxxxx实现RequestHandler{ @凌驾 public AccountResponse HandlerRequest(对象输入、上下文){ } }


Lambda看起来有点像这样,只需填充并返回对象以匹配响应结构,错误就会消失。希望这有帮助。

无论何时我们从后端将对象返回到bot,请确保我们需要将内容类型与内容一起传递。但在这里我们走错了。所以我们需要像下面这样通过。它位于Node.js中

 let message = {
        contentType: "PlainText",
        content: 'Testing bot'
      }; 

每当我们从后端将对象返回到bot时,请确保我们需要将内容类型与内容一起传递。但在这里我们走错了。所以我们需要像下面这样通过。它位于Node.js中

 let message = {
        contentType: "PlainText",
        content: 'Testing bot'
      }; 

这个线程似乎解决了同样的问题:是的,类似,但我的问题是Lex处理Lambda的响应,而不是Lambda处理Lex(whic)的请求