2016-05-11 6 views
5

kann nicht deserialisiert werden. Ich habe eine Lambda-Funktion erstellt und möchte mit Hilfe des API-Gateways darauf zugreifen.AWS Die Instanz von java.lang.String aus START_OBJECT

Ich habe alles eingerichtet, ich habe erstellt auch eine application/json Body-Mapping-Vorlage in API-Gateway wie folgt aussehen:

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

Und dann bin ich auslösenden HTTP-GET-Anforderung, die wie folgt aussieht:

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

Mein Java-Handler-Klasse sieht wie folgt aus:

public class LambdaFunctionHandler implements RequestHandler<String, String> { 

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

A Dies ist die vollständige Fehlermeldung:

{ 
    "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: [email protected]; 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: [email protected]; 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)" 
     ] 
    } 
    } 
} 
+0

geschieht dies, bevor Sie Ihre Java-Funktion aufgerufen wird, oder danach? Wird Ihre "Eingabe:" Protokollmeldung in den Protokollen angezeigt? –

Antwort

4

Dies ist eine Fehlermeldung während der Lambda-Deserialisierung.

Ihre API-Gateway-Zuordnungsvorlage sendet ein JSON-Objekt, aber Ihr Handler erwartet einen String. Senden Sie entweder eine unbearbeitete Zeichenfolge von API Gateway oder aktualisieren Sie Ihren Handler, um ein POJO zu verwenden, das Ihrer Vorlagenausgabe entspricht.

heißt

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

See: http://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-req-resp.html

+0

"Entweder eine rohe Zeichenfolge vom API-Gateway senden": Wie wird das gemacht? Auf welche "Vorlagenausgabe" bezieht sich die Antwort? – Harald