Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Unntakshåndtering | RESTful Api
Spring Boot Backend

bookUnntakshåndtering

Unntakshåndtering i en REST API med Spring Boot er et viktig aspekt ved utvikling som muliggjør effektiv håndtering av feil og informerer klienter om problemer som har oppstått på serveren. La oss se nærmere på denne prosessen i mer detalj.

Hvordan hjelper det å varsle klienten om feil?

Feilhåndtering i en REST API bidrar til å standardisere formatetfeilmeldinger, noe som gjør det enklere for klienter å arbeide med responsene. Dette informerer dem om årsakene til feil, slik at klientene kan forstå hva som gikk galt og hvordan de kan rette opp feilen.

I tillegg muliggjør slik håndtering differensiering mellom typer av feil, som valideringsfeil eller tilgangsproblemer, noe som gjør feilmeldingene mer presise og nyttige.

Implementering av unntakshåndtering ved bruk av annotasjoner

Spring Boot tilbyr flere verktøy for håndtering av unntak. De viktigste er annotasjonene @ControllerAdvice og @ExceptionHandler.

Annotasjonen @ControllerAdvice gjør det mulig å definere globale unntakshåndterere for alle kontrollere i applikasjonen, noe som bidrar til å sentralisere feilhåndtering og unngå duplisering av kode.

I en klasse annotert med @ControllerAdvice, angir metoder annotert med @ExceptionHandler hvilke typer unntak en spesifikk metode skal håndtere. Dette forenkler feilhåndtering og gjør koden mer oversiktlig og organisert.

GlobalExceptionHandler.java

GlobalExceptionHandler.java

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

I denne klassen vil metoden handleException() bli kalt når et unntak av typen ApiException oppstår i applikasjonen. Annotasjonen @ExceptionHandler(ApiException.class) indikerer at denne metoden håndterer unntak av denne spesifikke typen.

Opprette et egendefinert unntak

Men hva er egentlig ApiException? Det er et egendefinert unntak laget spesielt for vår API, og vi kan opprette våre egne unntak og bruke dem i vår REST API.

Du kan lære om hvordan du oppretter dine egne egendefinerte unntak her.

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; } }

Denne koden definerer ApiException-klassen, som arver fra RuntimeException og inkluderer et ekstra felt httpStatus for lagring av HTTP-status. Klassens konstruktør tar inn en melding og en HTTP-status, som deretter sendes til superkonstruktøren og lagres i httpStatus-feltet.

Etter dette kan vi kaste et unntak fra applikasjonen:

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); }

Denne typen unntak vil bli fanget opp av en metode handleException(ApiException ex) som er utformet for å håndtere det, og innenfor denne metoden kan vi definere logikken for håndtering av unntaket.

Logikken vi ønsker å implementere er å fange opp unntak relatert til API-et og returnere en strukturert respons som inneholder feilinformasjon sammen med riktig HTTP-status.

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() ); }

Denne koden håndterer ApiException ved å opprette en ResponseEntity med feilinformasjon. handleException()-metoden konstruerer et ErrorResponse-objekt med meldingen fra unntaket og setter HTTP-status fra unntakets httpStatus-felt, og returnerer dette til klienten.

Vi initialiserte httpStatus-feltet da vi kastet unntaket i vår applikasjon.

ErrorResponse er en klasse som brukes til å gi informasjon om feilen. Den inneholder et error-felt som viser feilbeskrivelsen og opprettes ved hjelp av annotasjonene @Data og @Builder.

ErrorResponse.java

ErrorResponse.java

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

@Builder-annotasjonen fra Lombok forenkler objektopprettelse ved å implementere Builder-mønsteret. Den gir en mer lesbar og vedlikeholdbar måte å konstruere objekter på, spesielt de med mange parametere. For eksempel kan du opprette en ErrorResponse-instans slik:

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

Metoden builder() initialiserer en ny builder for klassen ErrorResponse. Metoden error("ERROR") setter feltet error til "ERROR", og metoden build() konstruerer det endelige ErrorResponse-objektet med den angitte verdien.

Feilhåndtering i applikasjonen vår

Sammendrag

Unntakshåndtering i et REST API sentraliserer feilhåndtering ved å gi et konsekvent responsformat til klienten. Dette forenkler forståelsen og håndteringen av feil, ettersom klienter mottar tydelige og strukturerte meldinger.

Bruken av @ControllerAdvice og @ExceptionHandler annotasjoner muliggjør tilpasning av hvordan ulike unntak håndteres, mens egendefinerte unntak kan inkludere tilleggsinformasjon, som for eksempel HTTP-status.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 5

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Awesome!

Completion rate improved to 3.45

bookUnntakshåndtering

Sveip for å vise menyen

Unntakshåndtering i en REST API med Spring Boot er et viktig aspekt ved utvikling som muliggjør effektiv håndtering av feil og informerer klienter om problemer som har oppstått på serveren. La oss se nærmere på denne prosessen i mer detalj.

Hvordan hjelper det å varsle klienten om feil?

Feilhåndtering i en REST API bidrar til å standardisere formatetfeilmeldinger, noe som gjør det enklere for klienter å arbeide med responsene. Dette informerer dem om årsakene til feil, slik at klientene kan forstå hva som gikk galt og hvordan de kan rette opp feilen.

I tillegg muliggjør slik håndtering differensiering mellom typer av feil, som valideringsfeil eller tilgangsproblemer, noe som gjør feilmeldingene mer presise og nyttige.

Implementering av unntakshåndtering ved bruk av annotasjoner

Spring Boot tilbyr flere verktøy for håndtering av unntak. De viktigste er annotasjonene @ControllerAdvice og @ExceptionHandler.

Annotasjonen @ControllerAdvice gjør det mulig å definere globale unntakshåndterere for alle kontrollere i applikasjonen, noe som bidrar til å sentralisere feilhåndtering og unngå duplisering av kode.

I en klasse annotert med @ControllerAdvice, angir metoder annotert med @ExceptionHandler hvilke typer unntak en spesifikk metode skal håndtere. Dette forenkler feilhåndtering og gjør koden mer oversiktlig og organisert.

GlobalExceptionHandler.java

GlobalExceptionHandler.java

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

I denne klassen vil metoden handleException() bli kalt når et unntak av typen ApiException oppstår i applikasjonen. Annotasjonen @ExceptionHandler(ApiException.class) indikerer at denne metoden håndterer unntak av denne spesifikke typen.

Opprette et egendefinert unntak

Men hva er egentlig ApiException? Det er et egendefinert unntak laget spesielt for vår API, og vi kan opprette våre egne unntak og bruke dem i vår REST API.

Du kan lære om hvordan du oppretter dine egne egendefinerte unntak her.

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; } }

Denne koden definerer ApiException-klassen, som arver fra RuntimeException og inkluderer et ekstra felt httpStatus for lagring av HTTP-status. Klassens konstruktør tar inn en melding og en HTTP-status, som deretter sendes til superkonstruktøren og lagres i httpStatus-feltet.

Etter dette kan vi kaste et unntak fra applikasjonen:

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); }

Denne typen unntak vil bli fanget opp av en metode handleException(ApiException ex) som er utformet for å håndtere det, og innenfor denne metoden kan vi definere logikken for håndtering av unntaket.

Logikken vi ønsker å implementere er å fange opp unntak relatert til API-et og returnere en strukturert respons som inneholder feilinformasjon sammen med riktig HTTP-status.

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() ); }

Denne koden håndterer ApiException ved å opprette en ResponseEntity med feilinformasjon. handleException()-metoden konstruerer et ErrorResponse-objekt med meldingen fra unntaket og setter HTTP-status fra unntakets httpStatus-felt, og returnerer dette til klienten.

Vi initialiserte httpStatus-feltet da vi kastet unntaket i vår applikasjon.

ErrorResponse er en klasse som brukes til å gi informasjon om feilen. Den inneholder et error-felt som viser feilbeskrivelsen og opprettes ved hjelp av annotasjonene @Data og @Builder.

ErrorResponse.java

ErrorResponse.java

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

@Builder-annotasjonen fra Lombok forenkler objektopprettelse ved å implementere Builder-mønsteret. Den gir en mer lesbar og vedlikeholdbar måte å konstruere objekter på, spesielt de med mange parametere. For eksempel kan du opprette en ErrorResponse-instans slik:

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

Metoden builder() initialiserer en ny builder for klassen ErrorResponse. Metoden error("ERROR") setter feltet error til "ERROR", og metoden build() konstruerer det endelige ErrorResponse-objektet med den angitte verdien.

Feilhåndtering i applikasjonen vår

Sammendrag

Unntakshåndtering i et REST API sentraliserer feilhåndtering ved å gi et konsekvent responsformat til klienten. Dette forenkler forståelsen og håndteringen av feil, ettersom klienter mottar tydelige og strukturerte meldinger.

Bruken av @ControllerAdvice og @ExceptionHandler annotasjoner muliggjør tilpasning av hvordan ulike unntak håndteres, mens egendefinerte unntak kan inkludere tilleggsinformasjon, som for eksempel HTTP-status.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 5
some-alt