Volver a la página principal
viernes 11 octubre 2024
17

Cómo utilizar un enum como @PathVariable en Spring Boot

En Spring Boot, puedes usar un enum como parámetro de la URL mediante la anotación @PathVariable. Esto es útil cuando necesitas restringir los valores de un parámetro a un conjunto predefinido, lo que mejora la legibilidad del código y permite manejar rutas más claras y controladas.

Definir un enum y usarlo como @PathVariable

Primero, debes definir el enum que quieres utilizar en el @PathVariable de tu controlador. Luego, puedes crear un controlador REST que acepte ese enum como parte del path de la URL. Aquí se muestra cómo hacerlo:

Paso 1: Definir el enum

Crea un enum con los valores permitidos para el parámetro de la URL. Por ejemplo, supongamos que tienes un sistema que gestiona órdenes y deseas filtrar por estado de la orden:

public enum EstadoOrden {
    NUEVO,
    PROCESANDO,
    COMPLETADO,
    CANCELADO
}

Paso 2: Crear un controlador que acepte el enum como parámetro

En el controlador, usa @PathVariable para vincular el enum con una parte del path de la URL. Spring Boot automáticamente convertirá la cadena de la URL a un valor del enum.

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/ordenes")
public class OrdenController {

    @GetMapping("/{estado}")
    public String obtenerOrdenesPorEstado(@PathVariable EstadoOrden estado) {
        return "Obteniendo órdenes con estado: " + estado;
    }
}

Explicación del código

  • La URL http://localhost:8080/ordenes/NUEVO invocará el método obtenerOrdenesPorEstado con el parámetro estado establecido en EstadoOrden.NUEVO.
  • Si se intenta acceder a un valor no definido en el enum (por ejemplo, http://localhost:8080/ordenes/PENDIENTE), Spring lanzará una excepción 400 Bad Request automáticamente, ya que el valor no existe en el enum.

Paso 3: Personalizar el manejo de errores (opcional)

Si deseas personalizar la respuesta cuando se proporciona un valor de enum inválido, puedes implementar un manejador de excepciones para MethodArgumentTypeMismatchException:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;

@ControllerAdvice
public class EnumExceptionHandler {

    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
    public ResponseEntity<String> handleEnumConversionError(MethodArgumentTypeMismatchException ex) {
        String mensajeError = String.format("El valor '%s' no es válido para el estado de la orden. Valores permitidos: NUEVO, PROCESANDO, COMPLETADO, CANCELADO.",
                                            ex.getValue());
        return new ResponseEntity<>(mensajeError, HttpStatus.BAD_REQUEST);
    }
}

Otros ejemplos de uso de enum como @PathVariable

1. Filtrar productos por categoría:

public enum CategoriaProducto {
       ELECTRONICA,
       ROPA,
       HOGAR,
       LIBROS
   }

   @GetMapping("/productos/{categoria}")
   public List<Producto> obtenerProductosPorCategoria(@PathVariable CategoriaProducto categoria) {
       return productoService.buscarPorCategoria(categoria);
   }

2. Gestión de usuarios por roles:

public enum RolUsuario {
       ADMIN,
       CLIENTE,
       INVITADO
   }

   @GetMapping("/usuarios/{rol}")
   public List<Usuario> obtenerUsuariosPorRol(@PathVariable RolUsuario rol) {
       return usuarioService.buscarPorRol(rol);
   }

Referencia

Puedes obtener más información sobre cómo trabajar con @PathVariable y enum en la documentación oficial de Spring.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer