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
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
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
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.
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):
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.
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.
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.
Tags und Links scala java aws-lambda aws-api-gateway serverless-framework