Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

...

  1. ResponseStatusException

    Útil para devolver un error de forma correcta y rápida, sin preocuparnos de los datos devueltos.

    Se construye la excepción pasándole el status code HTTP de error deseado y Spring Boot la captura y maneja de forma automática.
    Devuelve el modelo de respuesta estándar (ver siguiente apartado).


    Ventajas: rápido, status code parametrizable.
    Desventajas: Modelo de respuesta fijo.

    Ejemplo:

    Bloque de código
    languagejava
    themeEclipse
    titleEjemplo de uso de ResponseStatusException
    try{
    .....
    throw new TestException( HttpStatus.BAD_REQUEST,"2. ResponseStatusException con FundeWebJSErrorAttributtes" );
    .....
    
    } catch ( final TestException e2 ) {
        //Se captura una excepción existente y se lanza una nueva ResponseStatusException
    	log.error( "Test de prueba de ResponseStatusException con custom FundeWebJSErrorAttributtes: {}",e2.getMessage() );
    	throw new ResponseStatusException( HttpStatus.INTERNAL_SERVER_ERROR, e2.getMessage(),e2.getCause() );
    
    } ....

    FuenteRest handleError (https://gitlab.um.es/mncs/fundewebjsshowcase-api/-/blob/desarrollo/src/main/java/es/um/atica/fundewebjsshowcasebackend/services/rest/impl/RestTestImpl.java).

    Petición:

    Bloque de código
    languagexml
    titleRequest ResponseStatusException
    https://fundewebjsshowcasedesa.um.es/api/v1.0/public/handleError/5

    Respuesta:

    Bloque de código
    languagejson
    titleResponse ResponseStatusException
    {
        "fecha": "05/10/2021 10:31:27",
        "estado": "INTERNAL_SERVER_ERROR",
        "mensaje": "2. ResponseStatusException con FundeWebJSErrorAttributtes",
        "tipoRespuesta": "CUSTOM_DefaultErrorAttributes"
    }


    1.1 ResponseStatus:

    La excepción ResponseStatusException es una evolución de otro mecanismo, la notación @ResponseStatus .
    Por comodidad se recomienda usar ResponseStatusException, pero es posible seguir usando esta notación declarándola nuestras excepciones y lanzándolas desde nuestra API REST directamente. 
    Ver: Ejemplo ResponseStatus (https://gitlab.um.es/mncs/fundewebjsshowcase-api/-/blob/desarrollo/src/main/java/es/um/atica/fundewebjsshowcasebackend/exceptions/TestResponseStatusException.java).

    Ejemplo ejecución:

    Bloque de código
    languagejava
    themeEclipse
    titleEjemplo declaración y uso @ResponseStatus
    ...
    @ResponseStatus( code = HttpStatus.BAD_REQUEST, reason = "Reason en ResponseStatus", value = HttpStatus.INTERNAL_SERVER_ERROR )
    public class TestResponseStatusException extends RuntimeException
    ....
    /
    try{
    ...   
    	throw new TestResponseStatusException( HttpStatus.BAD_REQUEST, "1. Notación ResponseStatus con FundeWebJSErrorAttributtes" );
    ...
    } catch ( final TestResponseStatusException e1 ) {
    	log.error( "Test de prueba de notación @ResponseStatus con custom FundeWebJSErrorAttributtes: {}",e1.getMessage() );
    	throw e1;
    }
    ...


    Bloque de código
    titleRequest con @ResponseStatus
    https://fundewebjsshowcasedesa.um.es/api/v1.0/public/handleError/1


    Bloque de código
    languagejson
    titleRespuesta con @ResponseStatus
    {
        "fecha": "05/10/2021 10:45:25",
        "estado": "BAD_REQUEST",
        "mensaje": "1. Notación ResponseStatus con FundeWebJSErrorAttributtes",
        "tipoRespuesta": "CUSTOM_DefaultErrorAttributes"
    }



    DefaultErrorAttributes

    Definición del Por defecto Spring usa el modelo de respuesta estándar(los campos que se devuelven) devuelto por la clase DefaultErrorAttributes.
    Se puede modificar y declarar para configurar un modelo de respuesta común para toda la aplicación.
    Poner código de servicio y enlaces a gitlab.
    Poner petición y respuesta ejemplo de postman
    Podemos modificar el modelo de respuesta estándar extendiendo esta clase (y anotándola con @Component).

    Cambiar el modelo de respuesta implica que, si no se usa otro mecanismo, el nuevo modelo será devuelto en todas las situaciones de error.

    Ejemplo de fichero extendido:

    Bloque de código
    languagejava
    themeEclipse
    titleCustom DefaultErrorAttributes
    @Component
    public class FundeWebJSErrorAttributes extends DefaultErrorAttributes {
    
    	private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager
    			.getLogger( FundeWebJSErrorAttributes.class );
    
    	public static final String TIPO_RESPUESTA = "CUSTOM_DefaultErrorAttributes";
    
    	@Override
    	public Map<String, Object> getErrorAttributes( WebRequest webRequest, boolean includeStackTrace ) {
    		final Map<String, Object> allErrorAttributes = super.getErrorAttributes( webRequest, includeStackTrace );
    		final Map<String, Object> errorAttributes = new HashMap<>();
    
    		final int statusCode = ( int ) allErrorAttributes.get( "status" );
    		errorAttributes.put( "tipoRespuesta", TIPO_RESPUESTA );
    		errorAttributes.put( "estado", HttpStatus.valueOf( statusCode ) );
    		errorAttributes.put( "fecha",
    				LocalDateTime.now().format( DateTimeFormatter.ofPattern( "dd/MM/yyyy HH:mm:ss" ) ) );
    
    		String mensaje = "";
    
    		final Throwable throwable = getError( webRequest );
    
    		if ( throwable instanceof ResponseStatusException ) {
    			final ResponseStatusException responseStatusException = ( ResponseStatusException ) throwable;
    			mensaje = responseStatusException.getReason() == null ? "" : responseStatusException.getReason();
    
    		} else if ( throwable instanceof ConstraintViolationException ) {
    			webRequest.setAttribute( "status", HttpStatus.BAD_REQUEST.value(), 1 );
    			errorAttributes.put( "estado", HttpStatus.BAD_REQUEST.toString() );
    			mensaje = throwable.getMessage() == null ? "" : throwable.getMessage();
    		} else {
    
    			if ( ( throwable != null ) && ( throwable.getMessage() != null ) ) {
    				mensaje = throwable.getMessage() == null ? "" : throwable.getMessage();
    			}
    
    		}
    
    		errorAttributes.put( "mensaje", mensaje );
    
    		return errorAttributes;
    	}
    
    }
    
    

    Fuente: FundeWebJSErrorAttributes.java

    Advertencia

    No se recomienda desarrollar modelos propios de respuesta estándar hasta que se complete la integración con el RFC 7807 Problem Details for HTTP APIs por parte de MNCS.


  2. ExceptionHandler


    Manejar excepciones de forma local, permite modificar valores de la respuesta http así como el modelo.

    Desventajas: solo funciona de forma local.

    Poner código de servicio y enlaces a gitlab.
    Poner petición y respuesta ejemplo de postman.
  3. ControllerAdvice

    Permite centralizar el manejo de excepciones para que se capturen de forma global.

    Poner código de servicio y enlaces a gitlab.
    Poner petición y respuesta ejemplo de postman.

...