2017-07-06 12 views
1

eclipse AWS SDKでJava8を使用して、私のlex intelentの実行時にフックされるラムダ関数を作成してアップロードしました。 LambdaはJSONリクエストと解析を受信することに問題はありません。 はその後、私は、単純な「閉じる」dialogAction応答をフォーマットし、lexとlexのコンソールでテストボットページから、次のエラーを受け取るために送り返す:AWS Lexがラムダ関数からInvalid Responseを受け取ります - IntentResponseのインスタンスを構築できません

すぐフォーマットに問題があるようです
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のログにそれを書いていますし、次のように書いている:私が試した

{ 
    "dialogAction": { 
     "type": "Close", 
     "fulfillmentState": "Fulfilled", 
     "message": { 
      "contentType": "PlainText", 
      "content": "Thanks I got your info" 
     } 
    } 
} 

もの:

  • メッセージ要素を削除する必要はありません。
  • sessionAttributesなどの必須ではないプロパティを追加すると、 responseCa RDなど
  • は、ドキュメント

でサンプル応答形式のメッセージからJSONをハードコーディングする単一引用符

  • で二重引用符を置き換える二重引用符を削除
  • レベルHTTPヘッダに隠された何かがあるのか​​java8がやっています表示されないJSONの何か?

  • +0

    このスレッドは、同じ問題に対処しているようです:https://stackoverflow.com/questions/44756575/jackson-json-deserialization-for-amazon-lex-aws-lambda-hook –

    +0

    これは似ていますが、私のLexがLambdaからの応答を処理しているのではなく、Lexからの要求を処理しているLambda(これは私ができる)です。 – Mattbob

    答えて

    2

    Java8を使用しているかどうかはわかりませんが、RequestHandlerクラスのhandleRequestメソッドの戻り値 "String"は機能しません。 はい、文字列はオブジェクトですが、Lex側のコンストラクタは「オブジェクト」を期待しています。私は、lexレスポンスPOJOをhandleRequestメソッドで返す前にStringに変換していました。それは私の間違いでした。

    handleRequestメソッドの戻り値の型を "String"ではなく "Object"に変更して修正しました。

    public Object handleRequest(Object input, Context context) 
    

    代わりの

    public String handleRequest(Object input, Context context) 
    

    また

    public class LambdaFunctionHandler implements RequestHandler<Object, Object> 
    

    ない

    public class LambdaFunctionHandler implements RequestHandler<Object, String> 
    

    を実装するためにこれは私の問題を解決しました。

    1

    私のケースでは、まったく同じ問題に直面していて、特定の応答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; 
        } 
    } 
    

    注、私もちょうどより安全側にあることを「Serializableを実装」が追加されました。恐らくそれは過度のものです。 「handleRequest」メソッドの戻り値の型を「Object」に変更した後でもうまく書式設定されたJSON Stringオブジェクトを返す理由がわかりません。私はこれが古い質問ですけど

    0

    しかし、これは他のいくつかの

    @Mattbobソリューションくぼみが私の問題を修正するのに役立つかもしれないと思った。しかし、彼は正しい道です。最善の方法は、Responseオブジェクト、カスタムレスポンスオブジェクトを使用して、ラムダがカスタムレスポンスオブジェクトを返すようにすることです。だから私は、ドキュメントに行って、私は再作成しなければならなかったので、レスポンスオブジェクトに一致したSDK内のオブジェクトを見つけるcouldntの質問に答える時に、ここで応答形式

    http://docs.aws.amazon.com/lex/latest/dg/lambda-input-response-format.html

    に見えるカスタムオブジェクトを作成したが、いくつかのいずれかを知っていれば

    Class xxxxx implements RequestHandler<Object, AccountResponse> { 
    
    @Override 
    public AccountResponse handleRequest(Object input, Context context) { 
    

    }}

    ラムダはやや次のようになりますとjの下にコメントしてくださいレスポンス構造に一致させるためにオブジェクトを生成して返し、エラーが消えます。お役に立てれば。

    関連する問題