Ir al contenido

Tutorial: Agregar el endpoint POST /artistas

Al terminar este tutorial vas a ser capaz de:

  • Agregar un endpoint de escritura a un controller REST con @PostMapping.
  • Usar @RequestBody para que Spring convierta el JSON recibido en un DTO.
  • Usar @ResponseStatus para controlar el código de estado HTTP de la respuesta.
  • Explicar por qué, sin un método de guardado en el repositorio, este POST todavía no persiste el artista nuevo, y qué significa eso para el id que llega en la respuesta.

Prerrequisitos: haber completado el tutorial de la implementación en memoria (tu GET /artistas ya responde con datos reales).


Abre:

src/main/java/co/edu/uniandes/musical/artistas/ArtistaController.java

Ya existe ahí un endpoint GET /artistas que usa artistaRepository.findAll(). Vas a agregar el POST al lado, en la misma clase.


  • ArtistaDTO: el objeto que representa un artista (id, nombre, fotoArtistaUrl, paisOrigen, biografia, fechaNacimiento, albumes). Usa Lombok (@Data), así que ya tiene getters, setters y constructores generados.
  • ArtistaRepository: hoy solo declara findAll(). No tiene ningún método para guardar, porque este tutorial todavía no lo necesita: vas a ver por qué en el paso 6.

4. Agrega las anotaciones necesarias de Spring

Sección titulada «4. Agrega las anotaciones necesarias de Spring»

En el controller necesitas tres anotaciones de Spring Web:

Anotación Para qué sirve
@PostMapping("/artistas") Mapea el método a peticiones HTTP POST a la ruta /artistas.
@RequestBody Le dice a Spring que convierta el JSON del body de la petición en un objeto ArtistaDTO.
@ResponseStatus(HttpStatus.CREATED) Hace que la respuesta tenga código 201 en vez del 200 por defecto.

Impórtalas al inicio del archivo:

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseStatus;

Debajo del método listarArtistas, agrega:

@PostMapping("/artistas")
@ResponseStatus(HttpStatus.CREATED)
public ArtistaDTO crearArtista(@RequestBody ArtistaDTO artista) {
return artista;
}
  • @PostMapping("/artistas"): el método responde a POST http://localhost:8080/artistas.
  • @RequestBody ArtistaDTO artista: Spring toma el JSON enviado por el front y lo convierte automáticamente en un ArtistaDTO, igual que ya vio con Jackson en el tutorial de la implementación en memoria.
  • return artista: por ahora, sin repositorio de por medio, el método devuelve el mismo objeto que recibió.
  • @ResponseStatus(HttpStatus.CREATED): asegura que la respuesta HTTP tenga código 201, en vez del 200 que Spring pone por defecto cuando un método devuelve un objeto.

Compila para verificar:

Ventana de terminal
./mvnw compile

Fíjate que crearArtista nunca llama a artistaRepository. Es a propósito: hoy ArtistaRepository solo declara findAll(), no tiene ningún método para agregar un artista nuevo a la lista en memoria.


7. Un detalle de Jackson: id y albumes llegan en null

Sección titulada «7. Un detalle de Jackson: id y albumes llegan en null»

Tu front (si ya construiste el formulario de creación) envía un NuevoArtista, un Artista sin id ni albumes. Cuando ese JSON llega aquí, Jackson convierte lo que encuentra y dejar en null lo que no viene en el JSON — el mismo comportamiento silencioso que ya vio en el tutorial de la implementación en memoria.

Como crearArtista devuelve el mismo objeto que recibió, la respuesta va a incluir "id": null y "albumes": null.


Si quieres ver en la consola qué está llegando desde el front:

private static final Logger log = LoggerFactory.getLogger(ArtistaController.class);

Y dentro del método, antes del return:

log.info("POST /artistas - body recibido: {}", artista);

Puedes apagarlo sin tocar el código Java, cambiando el nivel en application.properties:

logging.level.co.edu.uniandes.musical.artistas=INFO

(Cambia INFO por OFF para apagarlo.)


Reinicia la aplicación:

Ventana de terminal
./mvnw spring-boot:run

Y haz la petición, por ejemplo con curl:

Ventana de terminal
curl -X POST http://localhost:8080/artistas \
-H "Content-Type: application/json" \
-d '{
"nombre": "Shakira",
"fotoArtistaUrl": "https://picsum.photos/seed/shakira/200",
"paisOrigen": "Colombia",
"fechaNacimiento": "1977-02-02",
"biografia": "Cantante colombiana."
}'

Deberías recibir:

  • Código de respuesta: 201 Created.
  • Body: el mismo artista que enviaste, más "id": null y "albumes": null (paso 7).

Si ya tienes el formulario de creación construido, revisa que:

  • La URL apunte a http://localhost:8080/artistas.
  • El header Content-Type: application/json esté presente (Angular lo pone automático cuando envías un objeto con HttpClient.post).
  • El componente reciba el 201 como éxito — los códigos 2xx se consideran éxito en RxJS/HttpClient, así que tu next se ejecuta normalmente.

Al final de este tutorial tienes:

  • POST /artistas respondiendo 201 Created con el artista recibido.
  • Un endpoint que todavía no persiste nada: el Controller sigue sin Service, y el Repository sigue sin un método de guardado.
  • Claridad sobre por qué la respuesta trae id y albumes en null, y qué falta para que dejen de estarlo.

Lo que viene después: cuando el módulo necesite validar datos antes de crear un artista, vas a insertar el Service entre el Controller y el Repository, y a agregar el método de guardado que hoy le falta a ArtistaRepository — sin tocar el contrato que ya expone el endpoint.