Spring Boot

SpringBoot

Tutorial SpringBoot: Métodos DELETE en controladores REST

Aprende a implementar métodos DELETE en controladores REST usando @DeleteMapping en Spring para eliminar recursos con validación y manejo de errores.

Aprende SpringBoot y certifícate

Borrado con DeleteMapping

La anotación @DeleteMapping permite crear endpoints REST que manejan peticiones HTTP DELETE para eliminar recursos del sistema. Esta anotación forma parte del conjunto de anotaciones especializadas de Spring que simplifican la creación de APIs REST siguiendo las convenciones del protocolo HTTP.

Configuración básica de DeleteMapping

Para implementar un endpoint de borrado, utilizamos @DeleteMapping junto con la ruta del recurso que queremos eliminar. La convención REST establece que las operaciones de borrado deben incluir el identificador del recurso en la URL:

@RestController
@RequestMapping("/api/usuarios")
public class UsuarioController {

    @Autowired
    private UsuarioService usuarioService;

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> eliminarUsuario(@PathVariable Long id) {
        usuarioService.eliminarPorId(id);
        return ResponseEntity.noContent().build();
    }
}

En este ejemplo, el endpoint responde a peticiones DELETE dirigidas a /api/usuarios/{id}, donde {id} representa el identificador único del usuario que se desea eliminar.

Códigos de respuesta HTTP apropiados

Las operaciones de borrado deben devolver códigos de estado HTTP que reflejen el resultado de la operación. Los más comunes son:

204 No Content - Indica que el recurso se eliminó correctamente:

@DeleteMapping("/{id}")
public ResponseEntity<Void> eliminarProducto(@PathVariable Long id) {
    productoService.eliminar(id);
    return ResponseEntity.noContent().build();
}

404 Not Found - Cuando el recurso no existe:

@DeleteMapping("/{id}")
public ResponseEntity<Void> eliminarCategoria(@PathVariable Long id) {
    boolean eliminado = categoriaService.eliminarSiExiste(id);
    
    if (eliminado) {
        return ResponseEntity.noContent().build();
    } else {
        return ResponseEntity.notFound().build();
    }
}

Validación antes del borrado

Es fundamental validar la existencia del recurso antes de intentar eliminarlo. Esto evita errores y proporciona respuestas más informativas al cliente:

@DeleteMapping("/{id}")
public ResponseEntity<String> eliminarPedido(@PathVariable Long id) {
    Optional<Pedido> pedido = pedidoService.buscarPorId(id);
    
    if (pedido.isEmpty()) {
        return ResponseEntity.notFound().build();
    }
    
    // Verificar si el pedido puede ser eliminado
    if (pedido.get().getEstado().equals("PROCESADO")) {
        return ResponseEntity.badRequest()
            .body("No se puede eliminar un pedido ya procesado");
    }
    
    pedidoService.eliminar(id);
    return ResponseEntity.noContent().build();
}

Borrado con confirmación mediante parámetros

En algunos casos, es útil requerir confirmación explícita para operaciones de borrado críticas:

@DeleteMapping("/{id}")
public ResponseEntity<String> eliminarCuenta(
        @PathVariable Long id,
        @RequestParam(required = true) boolean confirmar) {
    
    if (!confirmar) {
        return ResponseEntity.badRequest()
            .body("Debe confirmar la eliminación de la cuenta");
    }
    
    cuentaService.eliminarDefinitivamente(id);
    return ResponseEntity.noContent().build();
}

Borrado lógico vs físico

Muchas aplicaciones implementan borrado lógico en lugar de eliminar físicamente los registros de la base de datos:

@DeleteMapping("/{id}")
public ResponseEntity<Void> desactivarUsuario(@PathVariable Long id) {
    usuarioService.marcarComoEliminado(id);
    return ResponseEntity.noContent().build();
}

@DeleteMapping("/{id}/permanente")
public ResponseEntity<Void> eliminarUsuarioPermanente(@PathVariable Long id) {
    usuarioService.eliminarFisicamente(id);
    return ResponseEntity.noContent().build();
}

Manejo de errores en operaciones de borrado

Las operaciones de borrado pueden fallar por diversas razones. Es importante capturar estas situaciones y devolver respuestas apropiadas:

@DeleteMapping("/{id}")
public ResponseEntity<String> eliminarDocumento(@PathVariable Long id) {
    try {
        documentoService.eliminar(id);
        return ResponseEntity.noContent().build();
    } catch (DocumentoEnUsoException e) {
        return ResponseEntity.status(HttpStatus.CONFLICT)
            .body("El documento no puede eliminarse porque está siendo utilizado");
    } catch (DocumentoNoEncontradoException e) {
        return ResponseEntity.notFound().build();
    } catch (Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
            .body("Error interno del servidor");
    }
}

Borrado en lote

Para eliminar múltiples recursos de una vez, podemos aceptar una lista de identificadores:

@DeleteMapping("/lote")
public ResponseEntity<Map<String, Object>> eliminarVariosProductos(
        @RequestBody List<Long> ids) {
    
    List<Long> eliminados = new ArrayList<>();
    List<Long> noEncontrados = new ArrayList<>();
    
    for (Long id : ids) {
        if (productoService.existe(id)) {
            productoService.eliminar(id);
            eliminados.add(id);
        } else {
            noEncontrados.add(id);
        }
    }
    
    Map<String, Object> resultado = Map.of(
        "eliminados", eliminados,
        "noEncontrados", noEncontrados
    );
    
    return ResponseEntity.ok(resultado);
}

La implementación de endpoints de borrado con @DeleteMapping requiere considerar aspectos como la validación de datos, el manejo de errores y la elección de códigos de respuesta HTTP apropiados para crear APIs REST robustas y predecibles.

Aprende SpringBoot online

Otras lecciones de SpringBoot

Accede a todas las lecciones de SpringBoot y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Spring Boot

Spring Boot

Introducción Y Entorno

Spring Boot Starters

Spring Boot

Introducción Y Entorno

Inyección De Dependencias

Spring Boot

Introducción Y Entorno

Crear Proyecto Con Spring Initializr

Spring Boot

Introducción Y Entorno

Crear Proyecto Desde Visual Studio Code

Spring Boot

Introducción Y Entorno

Controladores Spring Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Vista En Spring Mvc Con Thymeleaf

Spring Boot

Spring Mvc Con Thymeleaf

Controladores Spring Rest

Spring Boot

Spring Mvc Con Thymeleaf

Open Api Y Cómo Agregarlo En Spring Boot

Spring Boot

Spring Mvc Con Thymeleaf

Servicios En Spring

Spring Boot

Spring Mvc Con Thymeleaf

Clientes Resttemplate Y Restclient

Spring Boot

Spring Mvc Con Thymeleaf

Rxjava En Spring Web

Spring Boot

Spring Mvc Con Thymeleaf

Métodos Post En Controladores Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Métodos Get En Controladores Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Formularios En Spring Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Crear Proyecto Con Intellij Idea

Spring Boot

Spring Mvc Con Thymeleaf

Introducción A Los Modelos Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Layouts Y Fragmentos En Thymeleaf

Spring Boot

Spring Mvc Con Thymeleaf

Estilización Con Bootstrap Css

Spring Boot

Spring Mvc Con Thymeleaf

Gestión De Errores Controlleradvice

Spring Boot

Spring Mvc Con Thymeleaf

Estilización Con Tailwind Css

Spring Boot

Spring Mvc Con Thymeleaf

Introducción A Controladores Rest

Spring Boot

Spring Rest

Métodos Get En Controladores Rest

Spring Boot

Spring Rest

Métodos Post En Controladores Rest

Spring Boot

Spring Rest

Métodos Delete En Controladores Rest

Spring Boot

Spring Rest

Métodos Put Y Patch En Controladores Rest

Spring Boot

Spring Rest

Gestión De Errores Restcontrolleradvice

Spring Boot

Spring Rest

Creación De Entidades Jpa

Spring Boot

Spring Data Jpa

Asociaciones De Entidades Jpa

Spring Boot

Spring Data Jpa

Repositorios Spring Data

Spring Boot

Spring Data Jpa

Métodos Find En Repositorios

Spring Boot

Spring Data Jpa

Inserción De Datos

Spring Boot

Spring Data Jpa

Actualizar Datos De Base De Datos

Spring Boot

Spring Data Jpa

Borrar Datos De Base De Datos

Spring Boot

Spring Data Jpa

Consultas Jpql Con @Query En Spring Data Jpa

Spring Boot

Spring Data Jpa

Api Query By Example (Qbe)

Spring Boot

Spring Data Jpa

Api Specification

Spring Boot

Spring Data Jpa

Repositorios Reactivos

Spring Boot

Spring Data Jpa

Configuración Base De Datos Postgresql

Spring Boot

Spring Data Jpa

Configuración Base De Datos Mysql

Spring Boot

Spring Data Jpa

Introducción A Jpa Y Spring Data Jpa

Spring Boot

Spring Data Jpa

Configuración Base De Datos H2

Spring Boot

Spring Data Jpa

Testing Unitario De Componentes Y Servicios

Spring Boot

Testing Con Spring Test

Testing De Repositorios Spring Data Jpa

Spring Boot

Testing Con Spring Test

Testing Controladores Spring Mvc Con Thymeleaf

Spring Boot

Testing Con Spring Test

Testing Controladores Rest Con Json

Spring Boot

Testing Con Spring Test

Testing De Aplicaciones Reactivas Webflux

Spring Boot

Testing Con Spring Test

Testing De Seguridad Spring Security

Spring Boot

Testing Con Spring Test

Testing Con Apache Kafka

Spring Boot

Testing Con Spring Test

Introducción Al Testing

Spring Boot

Testing Con Spring Test

Introducción A Spring Security

Spring Boot

Seguridad Con Spring Security

Seguridad Basada En Formulario

Spring Boot

Seguridad Con Spring Security

Registro De Usuarios En Api Rest

Spring Boot

Seguridad Con Spring Security

Login De Usuarios En Api Rest

Spring Boot

Seguridad Con Spring Security

Validación Jwt En Api Rest

Spring Boot

Seguridad Con Spring Security

Autenticación Jwt Completa En Api Rest

Spring Boot

Seguridad Con Spring Security

Seguridad Jwt En Api Rest Reactiva Spring Webflux

Spring Boot

Seguridad Con Spring Security

Autenticación Y Autorización Con Anotaciones

Spring Boot

Seguridad Con Spring Security

Fundamentos De Autenticación Oauth

Spring Boot

Seguridad Con Spring Security

Autenticación Oauth Con Github

Spring Boot

Seguridad Con Spring Security

Testing Con Spring Security Test

Spring Boot

Seguridad Con Spring Security

Autenticación Oauth En Api Rest

Spring Boot

Seguridad Con Spring Security

Introducción A Spring Webflux

Spring Boot

Reactividad Webflux

Spring Data R2dbc

Spring Boot

Reactividad Webflux

Controlador Reactivo Basado En Anotaciones

Spring Boot

Reactividad Webflux

Controlador Reactivo Basado En Funciones

Spring Boot

Reactividad Webflux

Operadores Reactivos Básicos

Spring Boot

Reactividad Webflux

Operadores Reactivos Avanzados

Spring Boot

Reactividad Webflux

Cliente Reactivo Webclient

Spring Boot

Reactividad Webflux

Introducción E Instalación De Apache Kafka

Spring Boot

Mensajería Asíncrona

Crear Proyecto Con Apache Kafka

Spring Boot

Mensajería Asíncrona

Creación De Producers

Spring Boot

Mensajería Asíncrona

Creación De Consumers

Spring Boot

Mensajería Asíncrona

Kafka Streams En Spring Boot

Spring Boot

Mensajería Asíncrona

Integración Con Angular

Spring Boot

Integración Frontend

Integración Con React

Spring Boot

Integración Frontend

Integración Con Vue

Spring Boot

Integración Frontend

Accede GRATIS a SpringBoot y certifícate

Ejercicios de programación de SpringBoot

Evalúa tus conocimientos de esta lección Métodos DELETE en controladores REST con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender el uso de la anotación @DeleteMapping para crear endpoints REST que manejan peticiones DELETE.
  • Aprender a validar la existencia de recursos antes de su eliminación.
  • Conocer los códigos de estado HTTP apropiados para operaciones de borrado.
  • Implementar manejo de errores y confirmaciones en operaciones DELETE.
  • Diferenciar entre borrado lógico y físico, y gestionar borrados en lote.