Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Gestione delle Eccezioni | API Restful
Spring Boot Backend

bookGestione delle Eccezioni

La gestione delle eccezioni in una REST API utilizzando Spring Boot rappresenta un aspetto cruciale dello sviluppo che consente una gestione efficace degli errori e informa i client riguardo ai problemi che si sono verificati sul server. Analizziamo questo processo in modo più dettagliato.

Come Aiuta a Notificare il Client degli Errori?

La gestione degli errori in una REST API contribuisce a standardizzare il formato delle risposte di errore, facilitando il lavoro dei client con le risposte. Questo, a sua volta, li informa sulle cause degli errori, permettendo ai client di comprendere cosa sia andato storto e come correggere il problema.

Inoltre, tale gestione consente la differenziazione tra tipi di errori, come errori di validazione o problemi di accesso, rendendo i messaggi di errore più precisi e utili.

Implementazione della Gestione delle Eccezioni Tramite Annotazioni

Spring Boot offre diversi strumenti per la gestione delle eccezioni. I principali sono le annotazioni @ControllerAdvice e @ExceptionHandler.

L'annotazione @ControllerAdvice consente di definire gestori globali delle eccezioni per tutti i controller nell'applicazione, facilitando la centralizzazione della gestione degli errori ed evitando la duplicazione del codice.

All'interno di una classe annotata con @ControllerAdvice, i metodi annotati con @ExceptionHandler specificano quali tipi di eccezioni un determinato metodo deve gestire. Questo semplifica la gestione degli errori e rende il codice più pulito e organizzato.

GlobalExceptionHandler.java

GlobalExceptionHandler.java

copy
12345678
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { // error handling } }

All'interno di questa classe, il metodo handleException() verrà richiamato quando si verifica un'eccezione di tipo ApiException nell'applicazione. L'annotazione @ExceptionHandler(ApiException.class) indica che questo metodo gestisce eccezioni di questo tipo specifico.

Creazione di un'eccezione personalizzata

Ma che cos'è esattamente ApiException? Si tratta di un'eccezione personalizzata creata specificamente per la nostra API, e possiamo creare le nostre eccezioni e utilizzarle nella nostra REST API.

Ulteriori informazioni sulla creazione di eccezioni personalizzate sono disponibili qui.

ApiException.java

ApiException.java

copy
12345678910111213141516
public class ApiException extends RuntimeException { // HTTP status code associated with this exception private final HttpStatus httpStatus; // Constructor to initialize the exception with a message and an HTTP status public ApiException(String message, HttpStatus httpStatus) { super(message); this.httpStatus = httpStatus; } // Getter method to retrieve the HTTP status public HttpStatus getHttpStatus() { return httpStatus; } }

Questo codice definisce la classe ApiException, che estende RuntimeException e include un ulteriore campo httpStatus per memorizzare lo stato HTTP. Il costruttore della classe accetta un messaggio e uno stato HTTP, che vengono poi passati al costruttore base e memorizzati nel campo httpStatus.

Dopo questo, è possibile lanciare un'eccezione dall'applicazione:

Main.java

Main.java

copy
1234567891011
public BookResponseDTO updateBook(String id, BookRequestDTO book) { Book modelBook = MapperBook.dtoRequestToModel(book); Book repositoryBook = bookRepository.updateBook(id, modelBook); // If the book was not found in the repository, throw an ApiException with a NOT_FOUND status if (repositoryBook == null) { throw new ApiException("Not found book by id: " + id, HttpStatus.NOT_FOUND); } return MapperBook.modelToResponseDto(repositoryBook); }

Questo tipo di eccezione verrà intercettato da un metodo handleException(ApiException ex) progettato per gestirla e, all'interno di tale metodo, è possibile definire la logica per la gestione dell'eccezione.

La logica che si desidera implementare consiste nell'intercettare eccezioni relative all'API e restituire una risposta strutturata contenente le informazioni sull'errore insieme allo stato HTTP appropriato.

Main.java

Main.java

copy
123456789
@ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { return new ResponseEntity<>(ErrorResponse .builder() .error(ex.getMessage()) .build(), ex.getHttpStatus() ); }

Questo codice gestisce l'ApiException creando un ResponseEntity con informazioni sull'errore. Il metodo handleException() costruisce un oggetto ErrorResponse con il messaggio proveniente dall'eccezione e imposta lo stato HTTP dal campo httpStatus dell'eccezione, restituendolo al client.

Abbiamo inizializzato il campo httpStatus quando lanciamo l'eccezione nella nostra applicazione.

ErrorResponse è una classe utilizzata per fornire informazioni sull'errore. Contiene un campo error che mostra la descrizione dell'errore ed è creata utilizzando le annotazioni @Data e @Builder.

ErrorResponse.java

ErrorResponse.java

copy
12345
@Data @Builder public class ErrorResponse { private String error; }

L'annotazione @Builder di Lombok semplifica la creazione degli oggetti implementando il Builder pattern. Consente un modo più leggibile e manutenibile di costruire oggetti, specialmente quelli con molti parametri. Ad esempio, è possibile creare un'istanza di ErrorResponse in questo modo:

ErrorResponse.builder().error("ERROR").build();

Il metodo builder() inizializza un nuovo builder per la classe ErrorResponse. Il metodo error("ERROR") imposta il campo error su "ERROR", e il metodo build() costruisce l'oggetto finale ErrorResponse con il valore specificato.

Gestione degli errori nella nostra applicazione

Riepilogo

La gestione delle eccezioni in una REST API centralizza la gestione degli errori fornendo un formato di risposta coerente per il client. Questo semplifica la comprensione e la gestione degli errori, poiché i client ricevono messaggi chiari e strutturati.

L'utilizzo delle annotazioni @ControllerAdvice e @ExceptionHandler consente la personalizzazione della gestione delle diverse eccezioni, mentre le eccezioni personalizzate possono includere informazioni aggiuntive, come lo stato HTTP.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 5

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Awesome!

Completion rate improved to 3.45

bookGestione delle Eccezioni

Scorri per mostrare il menu

La gestione delle eccezioni in una REST API utilizzando Spring Boot rappresenta un aspetto cruciale dello sviluppo che consente una gestione efficace degli errori e informa i client riguardo ai problemi che si sono verificati sul server. Analizziamo questo processo in modo più dettagliato.

Come Aiuta a Notificare il Client degli Errori?

La gestione degli errori in una REST API contribuisce a standardizzare il formato delle risposte di errore, facilitando il lavoro dei client con le risposte. Questo, a sua volta, li informa sulle cause degli errori, permettendo ai client di comprendere cosa sia andato storto e come correggere il problema.

Inoltre, tale gestione consente la differenziazione tra tipi di errori, come errori di validazione o problemi di accesso, rendendo i messaggi di errore più precisi e utili.

Implementazione della Gestione delle Eccezioni Tramite Annotazioni

Spring Boot offre diversi strumenti per la gestione delle eccezioni. I principali sono le annotazioni @ControllerAdvice e @ExceptionHandler.

L'annotazione @ControllerAdvice consente di definire gestori globali delle eccezioni per tutti i controller nell'applicazione, facilitando la centralizzazione della gestione degli errori ed evitando la duplicazione del codice.

All'interno di una classe annotata con @ControllerAdvice, i metodi annotati con @ExceptionHandler specificano quali tipi di eccezioni un determinato metodo deve gestire. Questo semplifica la gestione degli errori e rende il codice più pulito e organizzato.

GlobalExceptionHandler.java

GlobalExceptionHandler.java

copy
12345678
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { // error handling } }

All'interno di questa classe, il metodo handleException() verrà richiamato quando si verifica un'eccezione di tipo ApiException nell'applicazione. L'annotazione @ExceptionHandler(ApiException.class) indica che questo metodo gestisce eccezioni di questo tipo specifico.

Creazione di un'eccezione personalizzata

Ma che cos'è esattamente ApiException? Si tratta di un'eccezione personalizzata creata specificamente per la nostra API, e possiamo creare le nostre eccezioni e utilizzarle nella nostra REST API.

Ulteriori informazioni sulla creazione di eccezioni personalizzate sono disponibili qui.

ApiException.java

ApiException.java

copy
12345678910111213141516
public class ApiException extends RuntimeException { // HTTP status code associated with this exception private final HttpStatus httpStatus; // Constructor to initialize the exception with a message and an HTTP status public ApiException(String message, HttpStatus httpStatus) { super(message); this.httpStatus = httpStatus; } // Getter method to retrieve the HTTP status public HttpStatus getHttpStatus() { return httpStatus; } }

Questo codice definisce la classe ApiException, che estende RuntimeException e include un ulteriore campo httpStatus per memorizzare lo stato HTTP. Il costruttore della classe accetta un messaggio e uno stato HTTP, che vengono poi passati al costruttore base e memorizzati nel campo httpStatus.

Dopo questo, è possibile lanciare un'eccezione dall'applicazione:

Main.java

Main.java

copy
1234567891011
public BookResponseDTO updateBook(String id, BookRequestDTO book) { Book modelBook = MapperBook.dtoRequestToModel(book); Book repositoryBook = bookRepository.updateBook(id, modelBook); // If the book was not found in the repository, throw an ApiException with a NOT_FOUND status if (repositoryBook == null) { throw new ApiException("Not found book by id: " + id, HttpStatus.NOT_FOUND); } return MapperBook.modelToResponseDto(repositoryBook); }

Questo tipo di eccezione verrà intercettato da un metodo handleException(ApiException ex) progettato per gestirla e, all'interno di tale metodo, è possibile definire la logica per la gestione dell'eccezione.

La logica che si desidera implementare consiste nell'intercettare eccezioni relative all'API e restituire una risposta strutturata contenente le informazioni sull'errore insieme allo stato HTTP appropriato.

Main.java

Main.java

copy
123456789
@ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { return new ResponseEntity<>(ErrorResponse .builder() .error(ex.getMessage()) .build(), ex.getHttpStatus() ); }

Questo codice gestisce l'ApiException creando un ResponseEntity con informazioni sull'errore. Il metodo handleException() costruisce un oggetto ErrorResponse con il messaggio proveniente dall'eccezione e imposta lo stato HTTP dal campo httpStatus dell'eccezione, restituendolo al client.

Abbiamo inizializzato il campo httpStatus quando lanciamo l'eccezione nella nostra applicazione.

ErrorResponse è una classe utilizzata per fornire informazioni sull'errore. Contiene un campo error che mostra la descrizione dell'errore ed è creata utilizzando le annotazioni @Data e @Builder.

ErrorResponse.java

ErrorResponse.java

copy
12345
@Data @Builder public class ErrorResponse { private String error; }

L'annotazione @Builder di Lombok semplifica la creazione degli oggetti implementando il Builder pattern. Consente un modo più leggibile e manutenibile di costruire oggetti, specialmente quelli con molti parametri. Ad esempio, è possibile creare un'istanza di ErrorResponse in questo modo:

ErrorResponse.builder().error("ERROR").build();

Il metodo builder() inizializza un nuovo builder per la classe ErrorResponse. Il metodo error("ERROR") imposta il campo error su "ERROR", e il metodo build() costruisce l'oggetto finale ErrorResponse con il valore specificato.

Gestione degli errori nella nostra applicazione

Riepilogo

La gestione delle eccezioni in una REST API centralizza la gestione degli errori fornendo un formato di risposta coerente per il client. Questo semplifica la comprensione e la gestione degli errori, poiché i client ricevono messaggi chiari e strutturati.

L'utilizzo delle annotazioni @ControllerAdvice e @ExceptionHandler consente la personalizzazione della gestione delle diverse eccezioni, mentre le eccezioni personalizzate possono includere informazioni aggiuntive, come lo stato HTTP.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 5
some-alt