2015-08-17 1 views
4

I défini ma fonction lambda comme ça et téléchargé sur Amazon:Fonction d'appel AWS lambda avec le type d'entrée de classe interne

@Override 
public String handleRequest(Request input, Context context) { 
    String template = "%s ${greeting}"; 
    StrSubstitutor ss = new StrSubstitutor(input.replaceables); 
    String inputted = String.format(template, input.rawValues[0]); 
    return ss.replace(inputted); 
} 

La définition de classe de demande (classe intérieure):

public class Request { 
    String[] rawValues; 
    HashMap<String, String> replaceables; 

    public Request(){ 
     replaceables = new HashMap<String, String>(); 
    } 

    //...getter and setters 
} 

Appelez-le ensuite boto3 et obtenez la réponse suivante:

>>> client = boto3.client('lambda', 'us-west-2') 
>>> resp = client.invoke(FunctionName='myfunction', InvocationType='RequestResponse', Payload="""{"rawValues": ["jero"], "replaceables": {"greeting": "world"}}""") 
>>> resp['Payload'].read() 
'{"errorMessage":"An error occurred during JSON parsing","errorType":"java.lang.RuntimeException","stackTrace":[],"cause":{"errorMessage":"com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class mypackage.functions.Demo$Request]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)\\n at [Source: [email protected]; line: 1, column: 2]","errorType":"java.io.UncheckedIOException","stackTrace":[],"cause":{"errorMessage":"No suitable constructor found for type [simple type, class mypackage.functions.Demo$Request]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)\\n at [Source: [email protected]; line: 1, column: 2]","errorType":"com.fasterxml.jackson.databind.JsonMappingException","stackTrace":["com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)","com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1080)","com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:295)","com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:142)","com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1441)","com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1047)"]}}}' 

Erreur complète comme indiqué lors du test dans la console amazon:

"cause": { 
    "errorMessage": "No suitable constructor found for type [simple type, class mypackage.functions.Demo$Request]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)\n at [Source: [email protected]; line: 1, column: 4]", 
    "errorType": "com.fasterxml.jackson.databind.JsonMappingException", 
    "stackTrace": [ 
    "com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)", 
    "com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1080)", 
    "com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:295)", 
    "com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:142)", 
    "com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1441)", 
    "com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1047)" 
    ] 
} 

Donc, l'erreur principale retourné me fait penser qu'il ya un problème avec ma demande Définition de classe qui définit essentiellement le destinataire pour un délinéarisé JSON """{"rawValues": ["jero"], "replaceable": {"greeting": "world"}}""". Dans le documentation, il est indiqué que le type de carte java est pris en charge en tant que type d'entrée, mais je ne peux pas obtenir ce travail. Connaissez-vous un exemple de fonction java mappant des dictionnaires JSON avec Java Maps?

Répondre

4

Les classes internes non statiques ne peuvent pas être construites à partir d'une instance de la classe externe.

Essayez de faire la statique, comme classe interne (Request):

public static class Request { 
    ... 
}