web-dev-qa-db-fra.com

Comment gérer l'erreur d'analyse JSON dans le service Web Spring Rest

J'ai un service Web de repos développé avec Spring Boot.Je suis capable de gérer toutes les exceptions qui se produisent en raison de mon code, mais supposez que l'objet json que le client publie n'est pas compatible avec l'objet avec lequel je veux le désrialiser, je avoir

"timestamp": 1498834369591,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "JSON parse error: Can not deserialize value 

Je voulais savoir s'il existe un moyen pour cette exception, je peux fournir au client un message d'exception personnalisé. Je ne sais pas comment gérer cette erreur.

8
T Anna

Pour personnaliser ce message par contrôleur, utilisez une combinaison de @ExceptionHandler et @ResponseStatus au sein de vos contrôleurs:

    @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "CUSTOM MESSAGE HERE")
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public void handleException() {
        //Handle Exception Here...
    }

Si vous préférez définir ceci une fois et gérer ces exceptions globalement, utilisez un @ControllerAdvice classe:

@ControllerAdvice
public class CustomControllerAdvice {
    @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "CUSTOM MESSAGE HERE")
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public void handleException() {
        //Handle Exception Here...
    }
}
12
Kyle Anderson

Vous pouvez également étendre ResponseEntityExceptionHandler et remplacer la méthode handleHttpMessageNotReadable (exemple en Kotlin, mais très similaire en Java):

override fun handleHttpMessageNotReadable(ex: HttpMessageNotReadableException, headers: HttpHeaders, status: HttpStatus, request: WebRequest): ResponseEntity<Any> {
    val entity = ErrorResponse(status, ex.message ?: ex.localizedMessage, request)
    return this.handleExceptionInternal(ex, entity as Any?, headers, status, request)
}
0
jpadilladev