Poikkeusten Käsittely
Poikkeusten käsittely REST API:ssa käyttäen Spring Bootia on keskeinen osa kehitystä, joka mahdollistaa virheiden hallinnan ja ilmoittaa asiakkaille palvelimella tapahtuneista ongelmista. Tarkastellaan tätä prosessia yksityiskohtaisemmin.
Miten virheilmoitukset auttavat asiakasta?
Virheiden käsittely REST API:ssa auttaa yhtenäistämään virhevastausten muodon, mikä helpottaa asiakkaiden työskentelyä vastausten kanssa. Tämä puolestaan kertoo heille virheiden syyt, jolloin asiakkaat voivat ymmärtää mitä tapahtui ja miten ongelma voidaan korjata.
Lisäksi tällainen käsittely mahdollistaa erilaisten virhetyyppien erottelun, kuten validointivirheet tai käyttöoikeusongelmat, jolloin virheilmoitukset ovat tarkempia ja hyödyllisempiä.
Poikkeusten käsittelyn toteutus annotaatioiden avulla
Spring Boot tarjoaa useita työkaluja poikkeusten käsittelyyn. Tärkeimmät näistä ovat @ControllerAdvice- ja @ExceptionHandler-annotaatiot.
@ControllerAdvice-annotaation avulla voidaan määrittää globaalit poikkeuskäsittelijät kaikille sovelluksen controllereille, mikä auttaa keskittämään virheenkäsittelyn ja välttämään koodin toistoa.
Luokassa, joka on annotoitu @ControllerAdvice:lla, @ExceptionHandler-annotaatiolla varustetut metodit määrittävät, minkä tyyppisiä poikkeuksia tietty metodi käsittelee. Tämä yksinkertaistaa virheiden hallintaa ja tekee koodista selkeämpää ja järjestelmällisempää.
GlobalExceptionHandler.java
12345678@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { // error handling } }
Tässä luokassa handleException()-metodi kutsutaan, kun sovelluksessa tapahtuu ApiException-tyyppinen poikkeus. @ExceptionHandler(ApiException.class)-annotaatio osoittaa, että tämä metodi käsittelee tämän tyyppiset poikkeukset.
Oman poikkeuksen luominen
Mutta mitä tarkalleen on ApiException? Se on räätälöity poikkeus, joka on luotu erityisesti API:lle, ja voimme luoda omia poikkeuksia ja käyttää niitä REST API:ssamme.
Voit oppia oman räätälöidyn poikkeuksen luomisesta täältä.
ApiException.java
12345678910111213141516public 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; } }
Tämä koodi määrittelee ApiException-luokan, joka perii RuntimeException-luokan ja sisältää lisäkentän httpStatus HTTP-statuksen tallentamista varten. Luokan konstruktori ottaa viestin ja HTTP-statuksen, jotka välitetään yliluokan konstruktorille ja tallennetaan httpStatus-kenttään.
Tämän jälkeen voimme heittää poikkeuksen sovelluksestamme:
Main.java
1234567891011public 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); }
Tämä poikkeustyyppi käsitellään metodilla handleException(ApiException ex) , joka on suunniteltu käsittelemään kyseistä poikkeusta, ja kyseisessä metodissa voidaan määritellä logiikka poikkeuksen hallintaan.
Toteutettava logiikka on poimia API:iin liittyvät poikkeukset ja palauttaa jäsennelty vastaus, joka sisältää virhetiedot sekä sopivan HTTP-tilakoodin.
Main.java
123456789@ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { return new ResponseEntity<>(ErrorResponse .builder() .error(ex.getMessage()) .build(), ex.getHttpStatus() ); }
Tämä koodi käsittelee ApiException-poikkeuksen luomalla ResponseEntity-olion, joka sisältää virhetiedot. handleException()-metodi rakentaa ErrorResponse-olion käyttäen poikkeuksen viestiä ja asettaa HTTP-tilan poikkeuksen httpStatus-kentän perusteella, palauttaen tämän asiakkaalle.
Alustimme httpStatus-kentän kun heitimme poikkeuksen sovelluksessamme.
ErrorResponse on luokka, jota käytetään virhetietojen välittämiseen. Se sisältää error-kentän, joka näyttää virheen kuvauksen ja se luodaan käyttäen @Data- ja @Builder-annotaatioita.
ErrorResponse.java
12345@Data @Builder public class ErrorResponse { private String error; }
@Builder-annotaatio Lombok-kirjastosta helpottaa olioiden luomista toteuttamalla Builder-mallin. Se mahdollistaa selkeämmän ja ylläpidettävämmän tavan rakentaa olioita, erityisesti silloin kun parametreja on useita. Esimerkiksi voit luoda ErrorResponse-instanssin seuraavasti:
ErrorResponse.builder().error("ERROR").build();
builder() metodi alustaa uuden rakentajan ErrorResponse luokalle. error("ERROR") metodi asettaa error kentän arvoon "ERROR", ja build() metodi muodostaa lopullisen ErrorResponse olion määritetyllä arvolla.
Virheenkäsittely sovelluksessamme
Yhteenveto
Poikkeusten käsittely REST-rajapinnassa keskittää virheiden hallinnan tarjoamalla yhdenmukaisen vastausmuodon asiakkaalle. Tämä yksinkertaistaa virheiden ymmärtämistä ja käsittelyä, sillä asiakkaat saavat selkeitä ja rakenteisia viestejä.
@ControllerAdvice- ja @ExceptionHandler-annotaatioiden käyttö mahdollistaa erilaisten poikkeusten käsittelyn räätälöinnin, ja omilla poikkeuksilla voidaan välittää lisätietoja, kuten HTTP-tila.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Can you explain how to create a custom exception in Spring Boot?
What is the purpose of the ErrorResponse class in this context?
How does @ControllerAdvice improve error handling in a REST API?
Awesome!
Completion rate improved to 3.45
Poikkeusten Käsittely
Pyyhkäise näyttääksesi valikon
Poikkeusten käsittely REST API:ssa käyttäen Spring Bootia on keskeinen osa kehitystä, joka mahdollistaa virheiden hallinnan ja ilmoittaa asiakkaille palvelimella tapahtuneista ongelmista. Tarkastellaan tätä prosessia yksityiskohtaisemmin.
Miten virheilmoitukset auttavat asiakasta?
Virheiden käsittely REST API:ssa auttaa yhtenäistämään virhevastausten muodon, mikä helpottaa asiakkaiden työskentelyä vastausten kanssa. Tämä puolestaan kertoo heille virheiden syyt, jolloin asiakkaat voivat ymmärtää mitä tapahtui ja miten ongelma voidaan korjata.
Lisäksi tällainen käsittely mahdollistaa erilaisten virhetyyppien erottelun, kuten validointivirheet tai käyttöoikeusongelmat, jolloin virheilmoitukset ovat tarkempia ja hyödyllisempiä.
Poikkeusten käsittelyn toteutus annotaatioiden avulla
Spring Boot tarjoaa useita työkaluja poikkeusten käsittelyyn. Tärkeimmät näistä ovat @ControllerAdvice- ja @ExceptionHandler-annotaatiot.
@ControllerAdvice-annotaation avulla voidaan määrittää globaalit poikkeuskäsittelijät kaikille sovelluksen controllereille, mikä auttaa keskittämään virheenkäsittelyn ja välttämään koodin toistoa.
Luokassa, joka on annotoitu @ControllerAdvice:lla, @ExceptionHandler-annotaatiolla varustetut metodit määrittävät, minkä tyyppisiä poikkeuksia tietty metodi käsittelee. Tämä yksinkertaistaa virheiden hallintaa ja tekee koodista selkeämpää ja järjestelmällisempää.
GlobalExceptionHandler.java
12345678@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { // error handling } }
Tässä luokassa handleException()-metodi kutsutaan, kun sovelluksessa tapahtuu ApiException-tyyppinen poikkeus. @ExceptionHandler(ApiException.class)-annotaatio osoittaa, että tämä metodi käsittelee tämän tyyppiset poikkeukset.
Oman poikkeuksen luominen
Mutta mitä tarkalleen on ApiException? Se on räätälöity poikkeus, joka on luotu erityisesti API:lle, ja voimme luoda omia poikkeuksia ja käyttää niitä REST API:ssamme.
Voit oppia oman räätälöidyn poikkeuksen luomisesta täältä.
ApiException.java
12345678910111213141516public 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; } }
Tämä koodi määrittelee ApiException-luokan, joka perii RuntimeException-luokan ja sisältää lisäkentän httpStatus HTTP-statuksen tallentamista varten. Luokan konstruktori ottaa viestin ja HTTP-statuksen, jotka välitetään yliluokan konstruktorille ja tallennetaan httpStatus-kenttään.
Tämän jälkeen voimme heittää poikkeuksen sovelluksestamme:
Main.java
1234567891011public 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); }
Tämä poikkeustyyppi käsitellään metodilla handleException(ApiException ex) , joka on suunniteltu käsittelemään kyseistä poikkeusta, ja kyseisessä metodissa voidaan määritellä logiikka poikkeuksen hallintaan.
Toteutettava logiikka on poimia API:iin liittyvät poikkeukset ja palauttaa jäsennelty vastaus, joka sisältää virhetiedot sekä sopivan HTTP-tilakoodin.
Main.java
123456789@ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { return new ResponseEntity<>(ErrorResponse .builder() .error(ex.getMessage()) .build(), ex.getHttpStatus() ); }
Tämä koodi käsittelee ApiException-poikkeuksen luomalla ResponseEntity-olion, joka sisältää virhetiedot. handleException()-metodi rakentaa ErrorResponse-olion käyttäen poikkeuksen viestiä ja asettaa HTTP-tilan poikkeuksen httpStatus-kentän perusteella, palauttaen tämän asiakkaalle.
Alustimme httpStatus-kentän kun heitimme poikkeuksen sovelluksessamme.
ErrorResponse on luokka, jota käytetään virhetietojen välittämiseen. Se sisältää error-kentän, joka näyttää virheen kuvauksen ja se luodaan käyttäen @Data- ja @Builder-annotaatioita.
ErrorResponse.java
12345@Data @Builder public class ErrorResponse { private String error; }
@Builder-annotaatio Lombok-kirjastosta helpottaa olioiden luomista toteuttamalla Builder-mallin. Se mahdollistaa selkeämmän ja ylläpidettävämmän tavan rakentaa olioita, erityisesti silloin kun parametreja on useita. Esimerkiksi voit luoda ErrorResponse-instanssin seuraavasti:
ErrorResponse.builder().error("ERROR").build();
builder() metodi alustaa uuden rakentajan ErrorResponse luokalle. error("ERROR") metodi asettaa error kentän arvoon "ERROR", ja build() metodi muodostaa lopullisen ErrorResponse olion määritetyllä arvolla.
Virheenkäsittely sovelluksessamme
Yhteenveto
Poikkeusten käsittely REST-rajapinnassa keskittää virheiden hallinnan tarjoamalla yhdenmukaisen vastausmuodon asiakkaalle. Tämä yksinkertaistaa virheiden ymmärtämistä ja käsittelyä, sillä asiakkaat saavat selkeitä ja rakenteisia viestejä.
@ControllerAdvice- ja @ExceptionHandler-annotaatioiden käyttö mahdollistaa erilaisten poikkeusten käsittelyn räätälöinnin, ja omilla poikkeuksilla voidaan välittää lisätietoja, kuten HTTP-tila.
Kiitos palautteestasi!