The Cinefinder API implements a centralized error handling system using Spring’s @RestControllerAdvice. All exceptions are caught and transformed into consistent error responses with detailed information.
All errors follow a consistent JSON structure defined in ErrorResponse:
{ "type": "error", "code": "404", "details": "No se encontró la película con el título: Inception", "location": "uri=/peliculas/Inception", "moreInfo": "No se encontró en la ruta: /peliculas/Inception", "timestamp": "2026-03-04T10:30:45.123"}
HTTP Status: 404 NOT FOUNDThrown when a requested resource cannot be found.
throw new RecursoNoEncontradoException("No se encontró la película con id: " + id);
Example Response:
{ "type": "error", "code": "404", "details": "No se encontró la película con id: 123", "location": "uri=/peliculas/123", "moreInfo": "No se encontró en la ruta: /peliculas/123", "timestamp": "2026-03-04T10:30:45.123"}
Status: 400 BAD REQUESTThrown when attempting to create a película with a title that already exists.
throw new PeliculaTituloYaExistenteException("Inception");
Response:
{ "type": "error", "code": "400", "details": "Ya existe una película con el titulo de: Inception, por favor, intente con otro distinto", "location": "uri=/peliculas", "moreInfo": "No se pudo ingresar una pelicula categoria error en: /peliculas", "timestamp": "2026-03-04T10:30:45.123"}
PeliculaNoActualizadaException
Status: 400 BAD REQUESTThrown when a película update operation fails.Response:
{ "type": "error", "code": "400", "details": "Error message", "location": "uri=/peliculas/123", "moreInfo": "No se pudo actualizar la pelicula error en: /peliculas/123", "timestamp": "2026-03-04T10:30:45.123"}
PeliculaNoEliminadaException
Status: 400 BAD REQUESTThrown when a película deletion operation fails.Response:
{ "type": "error", "code": "400", "details": "Error message", "location": "uri=/peliculas/123", "moreInfo": "No se pudo eliminar la categoria error en: /peliculas/123", "timestamp": "2026-03-04T10:30:45.123"}
Status: 400 BAD REQUESTThrown when attempting to create a category with a name that already exists.
throw new CategoriaNombreYaExistenteException("Drama");
Response:
{ "type": "error", "code": "400", "details": "Ya existe una categoría con el nombre: Drama, por favor, intente con otro distinto", "location": "uri=/categorias", "moreInfo": "No se pudo ingresar una nueva categoria error en: /categorias", "timestamp": "2026-03-04T10:30:45.123"}
CategoriaNoActualizadaException
Status: 400 BAD REQUESTThrown when a category update operation fails.
CategoriaNoEliminadaException
Status: 400 BAD REQUESTThrown when a category deletion operation fails.
The GlobalExceptionHandler class (located at src/main/java/com/trainee/Cinefinder/exceptions/GlobalExceptionHandler.java) intercepts all exceptions using @RestControllerAdvice.
{ "type": "error", "code": "400", "details": "Ya existe una película con el titulo de: Inception, por favor, intente con otro distinto", "location": "uri=/peliculas", "moreInfo": "No se pudo ingresar una pelicula categoria error en: /peliculas", "timestamp": "2026-03-04T10:30:45.123"}
curl -X GET "http://localhost:8080/peliculas/NonExistentMovie"
Response (404):
{ "type": "error", "code": "404", "details": "No se encontró la película", "location": "uri=/peliculas/NonExistentMovie", "moreInfo": "No se encontró en la ruta: /peliculas/NonExistentMovie", "timestamp": "2026-03-04T10:30:45.123"}