AWS Lambda - Java Bohnen

9

Ich habe eine Anfrage, die wie folgt aussieht:

%Vor%

Der Handler ist wie folgt:

%Vor%

was dokumentiert wurde als:

%Vor%

Nun, das ist ein Kopieren und Einfügen aus einem der Tutorials. Und es funktioniert nicht. Ich nehme an, dass BeanProperty sich auf Body-Objekt-Eigenschaften bezieht; und das kann ich anhand des Beispiels here .

wenn ich Abfragezeichenfolgen haben möchte?

Ein Versuch war:

%Vor%

Was ergibt:

%Vor%

weist darauf hin, dass die Klasse mit einer leeren Map anstelle von queryStringParameters initialisiert wurde, die jedoch korrekt übergeben wurde

%Vor%

Hinweis: Ich folge diesem Weg, weil ich denke, dass es bequem und ausdrucksvoll wäre, Map in @BeanProperty queryStringParameters: Map[String, String] durch einen Typ T zu ersetzen, zum Beispiel

%Vor%

Allerdings sieht der obige Code {"name":"ciao", "surname":"bonjour"} als String aus, ohne herauszufinden, dass dieser String deserialisiert werden sollte.

BEARBEITEN

Ich habe auch versucht, die Scala Map mit einem java.util.Map[String, String] ohne Erfolg zu ersetzen

    
NoIdeaHowToFixThis 25.09.2017, 19:38
quelle

1 Antwort

4

Serverless aktiviert standardmäßig Proxy-Integration zwischen dem Lambda und API-Gateway . Dies bedeutet für Sie, dass API Gateway ein Objekt mit allen Metadaten über die Anfrage an Ihren Handler übergeben wird, wie Sie festgestellt haben:

  

Mon Sep 25 20:45:22 UTC 2017: Endpoint Request Body nach den Transformationen: {"resource": "/ pricing / test", "Pfad": "/ pricing / test", "httpMethod": "GET" , "headers": null, "queryStringParameters": {"name": "ciao", "Nachname": "bonjour"}, "pathParameters": null, "stageVariables": null, ...

Dies entspricht eindeutig nicht Ihrem Modell, das nur die Felder name und surname enthält. Es gibt verschiedene Möglichkeiten, wie Sie das Problem lösen können.

1. Passen Sie Ihr Modell an

Ihr Versuch mit der HelloWorldRequest -Klasse funktioniert tatsächlich, wenn Sie Ihre Klasse zu einem POJO machen, indem Sie die Felder veränderbar machen (und damit die Setter für sie erstellen):

%Vor%

AWS Lambda-Dokumentation states :

  

Die Methoden get und set sind erforderlich, damit die POJOs mit dem integrierten JSON-Serializer von AWS Lambda arbeiten können.

Bedenken Sie auch, dass Scalas Map nicht unterstützt wird.

2. Verwenden Sie eine benutzerdefinierte Anforderungsvorlage

Wenn Sie die Metadaten nicht benötigen, können Sie, anstatt Ihr Modell zu ändern, das API-Gateway verwenden, indem Sie nur die benötigten Daten mit Zuordnungsvorlagen .

Um dies zu tun, müssen Sie Serverless anweisen, eine einfache Lambda-Integration (anstelle eines Proxys) zu verwenden und geben Sie eine benutzerdefinierte Anforderungsvorlage an .

Die Amazon API Gateway-Dokumentation enthält eine Beispiel-Anforderungsvorlage , die fast perfekt für Ihr Problem ist. Tailoring es ein bisschen, wir bekommen

%Vor%

Diese Vorlage wird ein JSON aus den Abfrage-String-Parametern machen, und es wird nun die Eingabe von Lambda sein:

  

Endpoint-Anfragetext nach den Transformationen: {"name": "ciao"}

Welche Karte passt zu Ihrem Modell?

Beachten Sie, dass die Deaktivierung der Proxy-Integration auch das Antwortformat ändert. Sie werden feststellen, dass Ihre API Ihr Antwortmodell jetzt direkt zurückgibt:

  

{"statusCode": 200, "body": "{\" Nachricht \ ": \" Hallo ciao \ "}", "Kopfzeilen": {"x-foo": "coucou"}, "base64Encoded" : true}

Sie können das beheben, indem Sie entweder Ihren Code so ändern, dass nur der Text zurückgegeben wird, oder indem Sie eine benutzerdefinierte Antwortvorlage hinzufügen:

%Vor%

Dies wird die Ausgabe in das, was Sie erwarten, transformieren, ignoriert aber eindeutig die statusCode und headers . Sie müssten eine komplexere Antwortkonfiguration erstellen, um diese zu handhaben.

3. Mach das Mapping selbst

Anstatt RequestHandler zu erweitern und AWS Lambda den JSON zu einem POJO zuordnen zu lassen, können Sie stattdessen RequestStreamHandler erweitern, wodurch Sie InputStream und OutputStream erhalten, so dass Sie die (De-) Serialisierung mit dem JSON-Serializer Ihrer Wahl durchführen können.

    
izstas 01.10.2017, 16:23
quelle