Manejo de Excepciones
El proyecto implementa un sistema centralizado de manejo de excepciones usando @ControllerAdvice
. Este enfoque permite una gestión consistente de errores en toda la aplicación.
Estructura de Respuesta de Error
Todas las excepciones se transforman en un formato estandarizado:
{
"message": "Mensaje principal del error",
"errors": [
"Detalle del error 1",
"Detalle del error 2"
]
}
Excepciones Personalizadas
NotFoundException
Usada cuando un recurso no se encuentra en el sistema.
// Ejemplo de uso
throw new NotFoundException("Usuario con ID 123 no encontrado");
// Respuesta (HTTP 404)
{
"message": "Recurso no encontrado",
"errors": ["Usuario con ID 123 no encontrado"]
}
InvalidTokenException
Lanzada cuando hay problemas con tokens JWT.
// Ejemplo de uso
throw new InvalidTokenException("Token expirado");
// Respuesta (HTTP 400)
{
"message": "Validación del token incorrecta",
"errors": ["Token expirado"]
}
Validación de Entrada
Las validaciones de DTO usando anotaciones como @Valid
son manejadas automáticamente:
// Ejemplo de DTO con validaciones
public class UserDTO {
@NotBlank(message = "El email es requerido")
@Email(message = "Email inválido")
private String email;
@Size(min = 8, message = "La contraseña debe tener al menos 8 caracteres")
private String password;
}
// Si la validación falla, la respuesta será (HTTP 400):
{
"message": "Validación de la petición incorrecta",
"errors": [
"El email es requerido",
"La contraseña debe tener al menos 8 caracteres"
]
}
Personalización de Excepciones
Para añadir nuevas excepciones personalizadas:
- Crea tu excepción personalizada:
public class MiExcepcionPersonalizada extends RuntimeException {
public MiExcepcionPersonalizada(String message) {
super(message);
}
}
- Añade el manejador en
GlobalExceptionHandler
:
@ExceptionHandler(MiExcepcionPersonalizada.class)
public ResponseEntity<ErrorResponse> handleMiExcepcion(
final MiExcepcionPersonalizada ex
) {
return ResponseEntity
.status(HttpStatus.BAD_REQUEST)
.body(new ErrorResponse(
"Título del error",
List.of(ex.getMessage())
));
}
Jerarquía de Excepciones
-
Excepciones Específicas: Manejadas primero
NotFoundException
InvalidTokenException
MethodArgumentNotValidException
-
Excepciones Generales: Capturan errores no manejados
Exception
Throwable
Mejores Prácticas
-
Mensajes de Error:
- Sé específico pero no reveles detalles internos
- Incluye IDs o referencias útiles para debugging
- Mantén un formato consistente
-
Códigos HTTP:
- 400: Errores de validación/cliente
- 401: No autenticado
- 403: No autorizado
- 404: Recurso no encontrado
- 500: Errores internos
-
Logging:
- Log errores inesperados para debugging
- No loguees información sensible
- Incluye IDs de correlación
-
Seguridad:
- No devuelvas stacktraces al cliente
- Sanitiza mensajes de error
- Maneja timeouts apropiadamente