CS2031:
Desarrollo Basado en Plataformas
Semana 05: Error Handling
Contenido
- Error Handling:
- Excepciones Web vs. Excepciones de Dominio
- @ResponseStatus
- ResponseStatusException
- @ExceptionHandler &
- Overview Exception Handling @ Spring
- Actividad 02
Excepciones
En una típica división de código en las capas de controller, service & repository.
¿Quién es el responsable?
Responsabilidad
Extracción de una cuenta de banco con saldo negativo
No se respeta una regla de negocio entre 2 instancias de un modelo
Se produce un timeout contra otro servidor por fallo de red
No se pudo realizar un INSERT de mi entidad con un ID ya existente en la base de datos
Responsabilidad
Error al adquirir la conexión contra la base de datos
Recibimos un atributo que no posee nuestra entidad (*)
Nos envían un JSON mal formado
¿División por cero? ¿Objeto Nulo? ¿Intentar hacer comparaciones de valores entre 2 objetos donde uno es nulo?
Tipos de Errores en Java

Gestión de Errores en Spring
@ResponseStatus
Podemos crear excepciones anotadas, para que al tirarlas desde un controller, se retorne el status code HTTP que pasemos por parámetro:
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Song not found")
public class SongNotFoundException extends RuntimeException {
}
Gestión de Errores en Spring
@ResponseStatusException
Es una alternativa a @ResponseStatus. Al realizar el throw de esta clase, se corta el flujo de nuestra app.
@GetMapping("/song/{id}")
public Song getSong(@PathVariable("id") Long id) {
try {
return songService.getSong(id);
} catch (SongNotFoundException exception) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND,
"Song Not Found", exception);
}
}
En este caso, además, estamos mapeando una excepción de dominio (SongNotFoundException) a una excepción del controller (404 NOT FOUND).
Gestión de Errores en Spring
@ExceptionHandler
Esta annotation nos permite referir a excepciones desde otras capas:
@ExceptionHandler(SongNotFound.class)
public void conflict() {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Song Not Found");
}
La desventaja es que solo funciona para un controller (*)
Gestión de Errores en Spring
@ExceptionHandler
Esta annotation nos permite referir a excepciones desde otras capas:
@ExceptionHandler(SongNotFound.class)
public ResponseEntity<String> conflict() {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Ocurrió un error");
}
La desventaja es que solo funciona para un controller (*)
Gestión de Errores en Spring
@RestControllerAdvice
Permite centralizar uno o más @ExceptionHandler en una misma clase.
@RestControllerAdvice
public class PersonaExceptionHandler {
@ExceptionHandler(value = {PersonaNameBad.class})
protected ResponseEntity<ErrorMessage> handleConflict(RuntimeException ex) {
return ResponseEntity
.status(HttpStatus.NOT_ACCEPTABLE)
.body(new ErrorMessage("Bad Code", HttpStatus.NOT_ACCEPTABLE.toString()));
}
}
¿Gestión de Errores en Spring?

Actividad
Implemente 2 excepciones en los siguientes métodos:
- Búsqueda de una canción por identificador.
- Otro método implementado en el Lab 2.01
References
Desarrollo Basado en Plataformas - Error Handling
By Jorge Rios
Desarrollo Basado en Plataformas - Error Handling
- 167