Volver a la página principal
sábado 1 febrero 2025
3

Cómo manejar errores con ProblemDetail en Spring Boot

ProblemDetail es una clase introducida en Spring Boot 3 para representar respuestas de error en APIs REST de manera estandarizada. Sigue la especificación RFC 7807 (Problem Details for HTTP APIs), proporcionando información estructurada sobre los errores en formato JSON.

Cómo usar ProblemDetail en Spring Boot

En Spring Boot, ProblemDetail permite personalizar las respuestas de error en controladores REST. Se puede utilizar en combinación con @ExceptionHandler para gestionar excepciones y devolver respuestas detalladas.

Implementación de ProblemDetail

Para manejar excepciones personalizadas en un controlador, puedes definir un @ExceptionHandler que devuelva un objeto ProblemDetail:

import org.springframework.http.HttpStatus;
import org.springframework.http.ProblemDetail;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(RuntimeException.class)
    public ProblemDetail handleRuntimeException(RuntimeException ex) {
        ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, ex.getMessage());
        problemDetail.setTitle("Error de ejecución");
        return problemDetail;
    }
}

Explicación del código

1. @RestControllerAdvice: Permite manejar excepciones globalmente en la aplicación.

2. @ExceptionHandler(RuntimeException.class): Captura excepciones del tipo RuntimeException.

3. ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, ex.getMessage()): Crea un objeto ProblemDetail con el código de estado HTTP y el mensaje de error.

4. problemDetail.setTitle("Error de ejecución"): Personaliza el título del error.

Ejemplo de respuesta JSON

Cuando se lanza una excepción, la API devuelve una respuesta con el siguiente formato:

{
  "type": "about:blank",
  "title": "Error de ejecución",
  "status": 400,
  "detail": "Mensaje de error específico"
}
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer