Erreur lors de l'exécution de "Hello World" pour AWS Lambda en Java


J'ai écrit suivant Hello World Lambda que j'exécute en téléchargeant sur AWS via AWS toolkit for Eclipse.

public class HelloWorldLambdaHandler implements RequestHandler<String, String> {
    public String handleRequest(String input, Context context) {
        System.out.println("Hello World! executed with input: " + input);
        return input;
    }
}

Je reçois l'erreur suivante lors de l'exécution du code ci-dessus. Une idée de ce que je fais peut-être mal ici? Le projet BTW Maven qui a ce gestionnaire, n'a pas d'autre classe et seule la dépendance est aws-lambda-java-core version 1.1.0.

Skip uploading function code since no local change is found...
Invoking function...
==================== FUNCTION OUTPUT ====================
{"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@2f7c7260; 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@2f7c7260; 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)"]}}}
Author: Hemant, 2016-02-22

5 answers

Pour une raison quelconque, Amazon ne peut pas désérialiser json en chaîne. Vous penseriez que la chaîne serait aussi générale que le paramètre d'entrée que vous pouvez obtenir, mais à tort ou à raison, ce n'est pas compatible.

Pour gérer JSON, vous pouvez utiliser une carte ou un POJO personnalisé.

public class HelloWorldLambdaHandler {
    public String handleRequest(Map<String,Object> input, Context context) {
        System.out.println(input);
        return "Hello";
    }
}
 88
Author: Lionel Port, 2016-03-02 23:01:26

Lire l'erreur de la trace de la pile. Il dit "Ne peut pas désérialiser l'instance de java.lang.Chaîne hors du jeton START_OBJECT". Le jeton "START_OBJECT" est '{'.

Le problème était simplement que vous devez passer une chaîne réelle en entrée, par exemple, "Une chaîne". Ceci est votre entrée json. Pas {}. {} n'est pas une Chaîne. Vous n'avez pas besoin d'accolades, juste une chaîne (entre guillemets). D'autre part, {} est un objet Person valide, donc cela a fonctionné une fois que vous l'avez changé pour gérer une personne comme entrée.

 16
Author: Kelly Denehy, 2016-06-01 17:48:11

J'ai essayé avec la valeur suivante dans le test :

"TestInput"

Au Lieu de :

{ Input : "TestInput"}

Et cela semble avoir bien fonctionné.

 12
Author: Anit Mohanty, 2018-07-20 13:56:31

La solution de travail complète est

public class HelloWorldLambdaHandler implements RequestHandler<String, String> {
    public String handleRequest(String input, Context context) {
        System.out.println("Hello World! executed with input: " + input);
        return input;
    }
}

Alors l'entrée doit être entre guillemets doubles en tant que chaîne - "Entrée de test"

 3
Author: kanaparthikiran, 2018-09-29 19:34:07

La fenêtre d'entrée du configurateur de test prend du json brut ou des chaînes.

  • Si vous transmettez du json brut, AWS convertit le json en une carte où les noms de variables sont des clés qui mappent les valeurs respectives.
  • Si vous enveloppez le json entre guillemets doubles et délimitez les guillemets internes, il s'agit d'une représentation Java string acceptable d'un objet json et peut être analysé comme d'habitude.
 0
Author: Javageek, 2019-05-22 19:33:56