Spring @RequestParam Anotación

1. Información general

En este tutorial rápido, exploraremos la anotación @RequestParam de Spring y sus atributos.

En pocas palabras, podemos usar @RequestParam para extraer parámetros de consulta, parámetros de formulario e incluso archivos de la solicitud.

2. Un mapeo simple

Digamos que tenemos un endpoint / api / foos que toma un parámetro de consulta llamado id :

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

En este ejemplo, usamos @RequestParam para extraer el parámetro de consulta id .

Una simple solicitud GET invocaría getFoos :

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

A continuación, echemos un vistazo a los atributos de la anotación: nombre , valor , obligatorio y valor predeterminado .

3. Especificación del nombre del parámetro de solicitud

En el ejemplo anterior, tanto el nombre de la variable como el nombre del parámetro son iguales.

Sin embargo, a veces queremos que sean diferentes. O, si no estamos usando Spring Boot, es posible que necesitemos hacer una configuración especial en tiempo de compilación o los nombres de los parámetros no estarán en el código de bytes.

Afortunadamente, podemos configurar el nombre @RequestParam usando el atributo de nombre :

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

También podemos hacer @RequestParam (value = "id") o simplemente @RequestParam ("id").

4. Parámetros de solicitud opcionales

Los parámetros del método anotados con @RequestParam son obligatorios de forma predeterminada.

Esto significa que si el parámetro no está presente en la solicitud, obtendremos un error:

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

Sin embargo, podemos configurar nuestro @RequestParam para que sea opcional, con el atributo requerido :

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

En este caso, ambos:

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

y

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

invocará correctamente el método.

Cuando no se especifica el parámetro, el parámetro del método está vinculado a nulo .

4.1. Uso de Java 8 opcional

Alternativamente, podemos envolver el parámetro en Opcional :

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

En este caso, no necesitamos especificar el atributo requerido .

Y el valor predeterminado se utilizará si no se proporciona el parámetro de solicitud:

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

5. Un valor predeterminado para el parámetro de solicitud

También podemos establecer un valor predeterminado para @RequestParam usando el atributo defaultValue :

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

Esto es como required = false, en el sentido de que el usuario ya no necesita proporcionar el parámetro :

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

Aunque, todavía podemos proporcionarlo:

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

Tenga en cuenta que cuando establecemos el atributo defaultValue , required se establece en falso .

6. Asignación de todos los parámetros

También podemos tener múltiples parámetros sin definir sus nombres o contar con solo usar un Mapa :

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

que luego reflejará cualquier parámetro enviado:

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

7. Asignación de un parámetro de valor múltiple

Un solo @RequestParam puede tener varios valores:

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

Y Spring MVC mapeará un parámetro de identificación delimitado por comas :

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

o una lista de parámetros de identificación separados :

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

8. Conclusión

En este artículo, aprendimos cómo usar @RequestParam.

El código fuente completo de los ejemplos se puede encontrar en el proyecto GitHub.