Spring @RequestParam Annotation

1. Übersicht

In diesem kurzen Tutorial werden wir die @ RequestParam- Annotation von Spring und ihre Attribute untersuchen.

Einfach ausgedrückt, können wir @RequestParam verwenden , um Abfrageparameter, Formularparameter und sogar Dateien aus der Anfrage zu extrahieren.

2. Eine einfache Zuordnung

Angenommen , wir haben einen Endpunkt / api / foos , der einen Abfrageparameter namens id verwendet :

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam String id) { return "ID: " + id; }

In diesem Beispiel haben wir @RequestParam verwendet , um den ID- Abfrageparameter zu extrahieren .

Eine einfache GET-Anfrage würde getFoos aufrufen :

//localhost:8080/api/foos?id=abc ---- ID: abc

Schauen wir uns als Nächstes die Attribute der Anmerkung an: Name , Wert , Erforderlich und Standardwert .

3. Angeben des Anforderungsparameternamens

Im vorherigen Beispiel sind sowohl der Variablenname als auch der Parametername identisch.

Manchmal möchten wir jedoch, dass diese anders sind. Wenn wir Spring Boot nicht verwenden, müssen wir möglicherweise eine spezielle Konfiguration zur Kompilierungszeit vornehmen, oder die Parameternamen befinden sich nicht im Bytecode.

Glücklicherweise können wir die Konfiguration @RequestParam Namen mit dem Namen Attribute :

@PostMapping("/api/foos") @ResponseBody public String addFoo(@RequestParam(name = "id") String fooId, @RequestParam String name) { return "ID: " + fooId + " Name: " + name; }

Wir können auch @RequestParam (Wert = "id") oder nur @RequestParam ("id") ausführen.

4. Optionale Anforderungsparameter

Mit @RequestParam kommentierte Methodenparameter sind standardmäßig erforderlich.

Dies bedeutet, dass, wenn der Parameter in der Anforderung nicht vorhanden ist, eine Fehlermeldung angezeigt wird:

GET /api/foos HTTP/1.1 ----- 400 Bad Request Required String parameter 'id' is not present

Wir können unser @RequestParam so konfigurieren , dass es optional ist, mit dem erforderlichen Attribut:

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam(required = false) String id) { return "ID: " + id; }

In diesem Fall beide:

//localhost:8080/api/foos?id=abc ---- ID: abc

und

//localhost:8080/api/foos ---- ID: null

ruft die Methode korrekt auf.

Wenn der Parameter nicht angegeben wird, ist der Methodenparameter an null gebunden .

4.1. Verwenden von Java 8 Optional

Alternativ können wir den Parameter in Optional umschließen :

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam Optional id){ return "ID: " + id.orElseGet(() -> "not provided"); }

In diesem Fall müssen wir das erforderliche Attribut nicht angeben .

Der Standardwert wird verwendet, wenn der Anforderungsparameter nicht angegeben wird:

//localhost:8080/api/foos ---- ID: not provided

5. Ein Standardwert für den Anforderungsparameter

Wir können auch einen Standardwert für @RequestParam festlegen, indem wir das Attribut defaultValue verwenden :

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam(defaultValue = "test") String id) { return "ID: " + id; }

Dies ist wie erforderlich = falsch, da der Benutzer den Parameter nicht mehr angeben muss :

//localhost:8080/api/foos ---- ID: test

Obwohl wir immer noch in Ordnung sind, es bereitzustellen:

//localhost:8080/api/foos?id=abc ---- ID: abc

Beachten Sie, dass , wenn wir das Set default Attribut, erforderlich in der Tat zu setzen ist falsch .

6. Alle Parameter zuordnen

Wir können auch mehrere Parameter haben, ohne deren Namen oder Anzahl zu definieren, indem wir nur eine Karte verwenden :

@PostMapping("/api/foos") @ResponseBody public String updateFoos(@RequestParam Map allParams) { return "Parameters are " + allParams.entrySet(); }

Dies spiegelt dann alle gesendeten Parameter wider:

curl -X POST -F 'name=abc' -F 'id=123' //localhost:8080/api/foos ----- Parameters are {[name=abc], [id=123]}

7. Zuordnen eines mehrwertigen Parameters

Ein einzelnes @RequestParam kann mehrere Werte haben:

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam List id) { return "IDs are " + id; }

Und Spring MVC ordnet einen durch Kommas getrennten ID- Parameter zu :

//localhost:8080/api/foos?id=1,2,3 ---- IDs are [1,2,3]

oder eine Liste separater ID- Parameter :

//localhost:8080/api/foos?id=1&id=2 ---- IDs are [1,2]

8. Fazit

In diesem Artikel haben wir gelernt, wie man @RequestParam verwendet.

Den vollständigen Quellcode für die Beispiele finden Sie im GitHub-Projekt.