Métodos POST, PUT y DELETE en Spring Boot

Clase 28 de 31Curso de Java: Backend con Spring Boot

Contenido del curso

JPA con Spring y Spring Data

Resumen

Construir un CRUD completo es una de las tareas fundamentales cuando trabajas con Spring Boot y una arquitectura REST. Aquí se aborda paso a paso la creación de los métodos para insertar, actualizar y eliminar usuarios, organizando la lógica en casos de uso independientes que mantienen el código limpio y desacoplado.

¿Cómo se estructuran los casos de uso con @Component?

Antes de programar los endpoints, se crean tres clases separadas que representan cada operación: CreateUser, UpdateUser y DeleteUser [0:30]. Cada una se anota con @Component, una anotación de Spring que permite registrar la clase como un bean genérico dentro del contenedor de inversión de control.

  • @Component se usa cuando la clase no encaja exactamente como servicio, repositorio o controlador.
  • Cada caso de uso recibe por inyección de dependencia la interfaz UserService.
  • Esta separación favorece el principio de responsabilidad única: cada clase resuelve una sola operación.

¿Cómo funciona el método POST para crear usuarios?

Dentro de UserRestController se define el endpoint de creación con la anotación @RequestMapping apuntando a la ruta raíz [1:20]. El método recibe un cuerpo de petición gracias a @RequestBody, que mapea automáticamente el JSON entrante a la entidad User.

java @RequestMapping("/") public ResponseEntity<User> newUser(@RequestBody User newUser) { return new ResponseEntity<>(createUser.save(newUser), HttpStatus.CREATED); }

  • @RequestBody indica que el parámetro proviene del cuerpo de la petición HTTP.
  • El caso de uso CreateUser invoca internamente a UserService.save(), que a su vez llama a UsersRepository.save() para persistir en base de datos [2:50].
  • Se retorna un ResponseEntity con el código 201 (CREATED), la práctica recomendada a nivel HTTP para indicar que un recurso se creó correctamente [3:30].

¿Por qué devolver HttpStatus.CREATED?

Devolver códigos de estado precisos es una buena práctica REST. El código 201 comunica al cliente (frontend o consumidor del API) que la operación fue exitosa y que el recurso ya existe en el servidor.

¿Cómo se implementan los métodos DELETE y PUT?

Para la eliminación se utiliza @DeleteMapping con un path variable que recibe el identificador del usuario [4:00].

java @DeleteMapping("/{id}") public ResponseEntity<Void> deleteUser(@PathVariable long id) { deleteUser.remove(id); return new ResponseEntity<>(HttpStatus.NO_CONTENT); }

  • @PathVariable extrae el valor {id} directamente de la URL.
  • El caso de uso DeleteUser llama a UserService.delete(), que ejecuta UsersRepository.delete() pasando una entidad construida con un constructor que solo recibe el id [5:10].
  • Se responde con 204 (NO_CONTENT) porque no hay cuerpo en la respuesta; solo se confirma que la operación fue exitosa [5:50].

¿Cómo se actualiza un usuario con PUT?

El método PUT combina @RequestBody y @PathVariable para recibir tanto el cuerpo nuevo como el identificador del registro a modificar [6:20].

java @PutMapping("/{id}") public ResponseEntity<User> replaceUser(@RequestBody User newUser, @PathVariable long id) { return new ResponseEntity<>(updateUser.update(newUser, id), HttpStatus.OK); }

Dentro del servicio, la lógica de actualización sigue estos pasos [7:30]:

  • Se busca el usuario existente con findById(id).
  • Se aplica un map sobre el resultado para setear los nuevos valores de email, birthdate y name.
  • Se guarda la entidad actualizada con userRepository.save().
  • Se retorna 200 (OK) porque no se creó un recurso nuevo, sino que se modificó uno existente [8:40].

java return userRepository.findById(id) .map(user -> { user.setEmail(newUser.getEmail()); user.setBirthdate(newUser.getBirthdate()); user.setName(newUser.getName()); return userRepository.save(user); });

Este patrón de buscar, mapear y persistir es habitual en aplicaciones Spring Boot y aprovecha las capacidades de Optional que devuelve el repositorio de Spring Data JPA.

Con estos tres endpoints configurados —POST, DELETE y PUT— el CRUD queda listo para ser probado. Cada operación respeta los códigos HTTP adecuados y mantiene la lógica separada en casos de uso claros. ¿Ya implementaste algún patrón distinto para organizar tus operaciones CRUD? Comparte tu experiencia en los comentarios.