2016-05-11 27 views
5

Ho creato una funzione Lambda e desidero accedervi tramite URL con l'aiuto del gateway API.AWS Impossibile deserializzare l'istanza di java.lang.String da START_OBJECT

ho installato il tutto, ho creato anche un modello di mappatura application/json corpo in gateway API simile a questo:

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

e poi sono innescando richiesta HTTP GET che assomiglia a questo:

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

mio Java classe del gestore si presenta così:

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 Questo è il messaggio di errore completo:

{ 
    "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

sta succedendo prima della funzione Java si chiama, o dopo? Il tuo messaggio di log "Input:" appare nei log? –

risposta

4

Questo è un messaggio di errore durante la deserializzazione Lambda.

Il modello di mapping del gateway API invia un oggetto JSON, ma il gestore si aspetta una stringa. Invia una stringa raw da API Gateway o aggiorna il gestore per utilizzare un POJO corrispondente all'output del modello.

cioè

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

"Invia una stringa grezza dal gateway API": come è fatto? A quale "modello di output" fa riferimento la risposta? – Harald