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)"]}}}
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";
}
}
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.
J'ai essayé avec la valeur suivante dans le test:
"TestInput"
au lieu de :
{ Input : "TestInput"}
et cela semble avoir bien fonctionné.
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"