web-dev-qa-db-fra.com

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

J'ai écrit après Hello World Lambda que je suis en train de l'exécuter en le téléchargeant sur AWS via AWS Toolkit pour 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 une 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 possède ce gestionnaire, n’a aucune autre classe et seule 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)"]}}}
30
Hemant

Pour une raison quelconque, Amazon ne peut pas désérialiser JSON en chaîne. On pourrait penser que String est un paramètre d’entrée aussi général que possible mais, à tort ou à raison, il est incompatible.

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";
    }
}
64
Lionel Port

Lisez l'erreur à partir de la trace de la pile. Il dit "Impossible de désérialiser l'instance de Java.lang.String à partir du jeton START_OBJECT". Le jeton "START_OBJECT" est "{".

Le problème était simplement que vous deviez passer une chaîne réelle en entrée, par exemple "Une chaîne". Ceci est votre entrée JSON. Ne 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 Personne valide. Il a donc fonctionné une fois que vous l'avez modifié pour gérer une Personne comme entrée.

12
Kelly Denehy

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

"TestInput"

au lieu de : 

{ Input : "TestInput"}

et cela semble avoir bien fonctionné.

6
Anit Mohanty

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 sous forme de chaîne - "Test d'entrée"

1
kanaparthikiran