@RequestParam , Spring MVC y sus opciones

Spring @RequestParam es una de las anotaciones más típicas cuando trabajamos con Spring o MVC ya sea a nivel de controladores como a nivel de servicios REST . Vamos a ver cuales son sus opciones a la hora de trabajar con ella . Para ello vamos a construir un ejemplo sencillo basado en la clase Persona.

Acabamos de ver como usar Java equals y hashcode

package com.arquitecturajava.web;

public class Persona {

  private String nombre;
  private String apellidos;
  private int edad;

  public Persona(String nombre, String apellidos, int edad) {
    super();
    this.nombre = nombre;
    this.apellidos = apellidos;
    this.edad = edad;
  }

  public String getNombre() {
    return nombre;
  }

  public void setNombre(String nombre) {
    this.nombre = nombre;
  }

  public String getApellidos() {
    return apellidos;
  }

  public void setApellidos(String apellidos) {
    this.apellidos = apellidos;
  }

  public int getEdad() {
    return edad;
  }

  public void setEdad(int edad) {
    this.edad = edad;
  }

}

Vamos a construir con Spring Boot un sencillo RESTController .

package com.arquitecturajava.web;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PersonaController {

  static List<Persona> lista= new ArrayList();
  static {
    
    lista.add(new Persona ("pepe","perez",20));
    
    lista.add(new Persona ("ana","gomez",30));
    
    lista.add(new Persona ("david","lopez",40));
    
    
  }
  @RequestMapping("/personas")
  public List<Persona>  buscarTodos() {
    
    return lista;
  }

  
}

En este caso simplemente hemos utilizado la anotación @RequestMapping para mapear la url de /personas  a una lista estática de personas que almacenamos en memoria.

Spring @RequestParam

Una vez que hemos dado de alta el primer mapeo simplemente invocamos la url en el navegador y podremos ver que nos devuelve la lista de objetos en formato JSON.

Es momento de añadir las urls que nos permitan filtrar a través del uso de parámetros :

@RequestMapping(value ="/personas" , params="nombre")
  public List<Persona>  buscarTodosPorNombre(@RequestParam String nombre ) {
    
    return lista.stream().filter((p)->p.getNombre().equals(nombre)).collect(Collectors.toList());
  }
  
  @RequestMapping(value ="/personas" , params="apellidos")
  public List<Persona>  buscarTodosPorApellidos(@RequestParam String apellidos ) {
    
    return lista.stream().filter((p)->p.getApellidos().equals(apellidos)).collect(Collectors.toList());
  }

Acabamos de utilizar la anotación @RequestParam que es capaz de leer los parámetros que adjuntemos a la url:

Veamoslo en acción:

Multiples Parámetros

Esta anotación permite también el uso de multiples parámetros a nivel de la url ya que por ejemplo podemos consultar por nombre y apellidos añadiendo múltiples parámetros a nivel de las anotaciones:

@RequestMapping(value ="/personas" , params={"nombre","apellidos"} )
  public List<Persona>  buscarTodosPorNombreyApellidos(@RequestParam String nombre ,@RequestParam String apellidos ) {
    
    Predicate<Persona> filtro= (p)->p.getApellidos().equals(apellidos);
    filtro.and((p->p.getNombre().equals(nombre)));
    
    return lista.stream().filter(filtro).collect(Collectors.toList());
  }

El resultado será :

@RequestParam y defaultValues

Hay situaciones en las cuales nos puede interesar  tener valores por defecto para los parámetros en el caso de que no se envíen  rellenos y se puedan procesar de forma natural:

@RequestMapping(value ="/personas" , params="orden")
  public List<Persona>  buscarTodos(@RequestParam (defaultValue = "nombre" ) String orden ) {
    
 
    if (orden.equals("nombre")) {
    
      return lista.stream().sorted(Comparator.comparing(Persona::getNombre)).collect(Collectors.toList());
    }else if (orden.equals("apellidos")) {
      
      return lista.stream().sorted(Comparator.comparing(Persona::getApellidos)).collect(Collectors.toList());
    }else {
      
      return lista.stream().sorted(Comparator.comparing(Persona::getEdad)).collect(Collectors.toList());
    }
    
    
    
  }

De esta manera si nosotros queremos obtener una lista de personas ordenada será tan sencillo como :

@RequestMapping(value ="/personas" , params="orden")
  public List<Persona>  buscarTodos(@RequestParam (defaultValue = "nombre" ) String orden ) {

    if (orden.equals("nombre")) {
    
      return lista.stream().sorted(Comparator.comparing(Persona::getNombre)).collect(Collectors.toList());
    }else if (orden.equals("apellidos")) {
      
      return lista.stream().sorted(Comparator.comparing(Persona::getApellidos)).collect(Collectors.toList());
    }else {
      
      return lista.stream().sorted(Comparator.comparing(Persona::getEdad)).collect(Collectors.toList());
    }
    
    
    
  }

Vamos a verlo en ejecución :

Acabamos de solicitar que nos ordene la lista por edad , pero también nos podemos encontrar que solicitemos la lista y se nos olvide pasar el parametro “orden” por ejemplo alguien no lo relleno en el formulario . Al disponer de un parámetro por defecto no hay problema la lista vendrá ordenada por nombre:

El uso de @RequestParam es fundamental en el día a día de los desarrollos web.

Otros artículos relacionados :