web-dev-qa-db-ja.com

AWSは、START_OBJECTからJava.lang.Stringのインスタンスを逆シリアル化できません

Lambda関数を作成しましたが、APIGatewayを使用してURL経由でアクセスしたいと思います。

すべてを設定しました。また、APIGatewayで次のようなapplication/jsonボディマッピングテンプレートを作成しました。

{ 
    "input": "$input.params('input')",
}

そして、次のようなHTTPGETリクエストをトリガーしています。

https://dmquh95ckh.execute-api.eu-west-1.amazonaws.com/prod/OtoTestFunction?input=test

私のJavaハンドラークラスは次のようになります:

public class LambdaFunctionHandler implements RequestHandler<String, String> {

    @Override
    public String handleRequest(String input, Context context) {
        context.getLogger().log("Input: " + input);
        return "Test completed."+input;
    }
}

そしてこれは完全なエラーメッセージです:

{
  "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@68c4039c; 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@68c4039c; 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:835)",
        "com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.Java:59)",
        "com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.Java:12)",
        "com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.Java:1441)",
        "com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.Java:1047)"
      ]
    }
  }
}
12
Ondrej Tokar

これは、ラムダの逆シリアル化中のエラーメッセージです。

API GatewayマッピングテンプレートはJSONオブジェクトを送信していますが、ハンドラーは文字列を予期しています。 API Gatewayから生の文字列を送信するか、テンプレート出力に対応するPOJOを使用するようにハンドラーを更新します。

つまり.

public class MyPojo {
   private String input;
   public String getInput() { return input; }
   public void setInput(String input) { this.input = input; }
}

参照: http://docs.aws.Amazon.com/lambda/latest/dg/Java-programming-model-req-resp.html

5
RyanG

入力引数のタイプを文字列からオブジェクトに変更すると、すべてのシナリオで機能しました。

public class LambdaFunctionHandler implements RequestHandler<Object, String> {

  @Override
  public String handleRequest(Object input, Context context) {
    String data= input != null ? input.toString() : "{}";
    context.getLogger().log("Input: " + data);
    return "Test completed."+data;
  }
}
2
skvp

オブジェクトをパラメータータイプおよびPojoクラスとして使用してみましたが、特定のシナリオで機能しましたが、APIゲートウェイURLを使用してブラウザーから要求を行っているときに失敗し、上記のエラーが発生しました。ほとんどの場合に機能する正しい署名を見つけるために、少なくとも2〜3時間を費やしました。ただし、これはhello worldの例ですが、要件に応じて入力をカスタマイズすることは明らかです。

public class LambdaFunctionHandler implements RequestHandler<***Map<String,Object>,***  Customer> { 
    @Override
    public Customer handleRequest(***Map<String,Object> input***, Context context) {

    }
}
0
Vikky