Versiones comparadas

Clave

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

...

Fuente: TestControllerAdvice.java (https://gitlab.um.es/mncs/fundewebjsshowcase-api/-/blob/desarrollo/src/main/java/es/um/atica/fundewebjsshowcasebackend/handler/TestControllerAdvice.java)

...

6. Bean Validation

...

Si estamos utilizando el estándar Bean Validation para realizar la validación de parámetros (path o request), posiblemente queramos capturar la excepción lanzada automáticamente para cambiar el mensaje (para incluir los errores de validación) y el código de respuesta HTTP (para devolver un 400 Bad Request en lugar de un 500).

La opción recomendada para manejar esta situación es añadir un ExceptionHandler en nuestro ControllerAdvice (ver ejemplo 4).

Ejemplo de uso:

Bloque de código
languagejava
themeEclipse
titleAnotaciones para validar parámetros
/**
* Anotaciones Min y Max para validar el párametro Path de entrada "ex".
*/ 
@Override
public ResponseEntity<Object> handleError( HttpServletRequest request, HttpSession session,
			@PathVariable( required = true ) @Min( 1 ) @Max( 4 ) Integer ex ) {...
}

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



Bloque de código
languagejava
titleControllerAdvice con ExceptionHandler para ValidationException
@RestControllerAdvice( basePackages = "es.um.atica.fundewebjsshowcasebackend" )
public class TestControllerAdvice extends ResponseEntityExceptionHandler {

/**
* Handler para la excepción raíz para validaciones javax.validation.ValidationException
*/
    @ExceptionHandler( ValidationException.class )
	public ResponseEntity<Object> handle( ValidationException ex ) {

		final TestControllerAdviceError error = TestControllerAdviceError.builder().estado( HttpStatus.BAD_REQUEST )
				.fecha( LocalDateTime.now() ).mensaje( ex.getMessage() ).build();

		final List<String> errorList = new ArrayList<>();

		if ( ex instanceof ConstraintViolationException ) {
			final Set<ConstraintViolation<?>> constraintViolations = ( ( ConstraintViolationException ) ex )
					.getConstraintViolations();

			errorList.addAll( constraintViolations.stream()
					.map( constraintViolation -> String.format( "%s value '%s' %s",
							constraintViolation.getPropertyPath(), constraintViolation.getInvalidValue(),
							constraintViolation.getMessage() ) )
					.collect( Collectors.toList() ) );
		} else {
			errorList.add( ex.getMessage() );
		}

		error.setErroresValidacion( errorList );

		return ResponseEntity.badRequest().body( error );
	}
}


Fuentes: 

TestControllerAdvice.java (https://gitlab.um.es/mncs/fundewebjsshowcase-api/-/blob/desarrollo/src/main/java/es/um/atica/fundewebjsshowcasebackend/handler/TestControllerAdvice.java)
POJO Error (https://gitlab.um.es/mncs/fundewebjsshowcase-api/-/blob/desarrollo/src/main/java/es/um/atica/fundewebjsshowcasebackend/error/TestControllerAdviceError.java).


Ejemplo de petición:


Bloque de código
languagexml
titlePetición con error de validación
https://fundewebjsshowcasedesa.um.es/api/v1.0/public/handleError/5



Bloque de código
languagejson
titleRespuesta con errores de validación
{
    "estado": "BAD_REQUEST",
    "fecha": "13/10/2021 05:26:36",
    "mensaje": "handleError.ex: must be less than or equal to 4",
    "tipoRespuesta": "CUSTOM_ControllerAdvice",
    "erroresValidacion": [
        "handleError.ex value '5' must be less than or equal to 4"
    ]
}


Info

La configuración y uso de Bean Validation queda como objetivo de la página de confluence: [EN CONSTRUCCIÓN]. Ante cualquier duda contacte con MNCS o revise las fuentes del proyecto de ejemplo fundewebjsshowcase-api.



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


...

Conclusión


Enumerar conclusiones, si se quiere hacer rápido usar ResponseStatusException, si se quiere cambiar la respuesta o el modelo y tenemos muchas excepciones usar ControllerAdvice + ResponseEntityExceptionHandler.

En un futuro cercano se integrará con el RFC Problem, se recomienda no elaborar muchos modelos de respuesta ya que posiblemente deban extender Problem.

...