...
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 | ||||||
|---|---|---|---|---|---|---|
| ||||||
/**
* 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 | ||||
|---|---|---|---|---|
| ||||
@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 | ||||
|---|---|---|---|---|
| ||||
https://fundewebjsshowcasedesa.um.es/api/v1.0/public/handleError/5 |
| Bloque de código | ||||
|---|---|---|---|---|
| ||||
{
"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.
...