Undtagelseshåndtering
Undtagelseshåndtering i en REST API ved brug af Spring Boot er et vigtigt aspekt af udviklingen, der muliggør effektiv håndtering af fejl og informerer klienter om problemer, der er opstået på serveren. Lad os undersøge denne proces i mere detalje.
Hvordan hjælper det med at informere klienten om fejl?
Fejlhåndtering i en REST API hjælper med at standardisere formatet af fejlbeskeder, hvilket gør det lettere for klienter at arbejde med beskederne. Dette informerer dem om årsagerne til fejl, hvilket gør det muligt for klienter at forstå, hvad der gik galt, og hvordan de kan rette problemet.
Derudover muliggør sådan håndtering en differentiering mellem typer af fejl, såsom valideringsfejl eller adgangsproblemer, hvilket gør fejlbeskederne mere præcise og brugbare.
Implementering af undtagelseshåndtering ved brug af annoteringer
Spring Boot tilbyder flere værktøjer til håndtering af undtagelser. De vigtigste er annotationerne @ControllerAdvice og @ExceptionHandler.
Annotationen @ControllerAdvice gør det muligt at definere globale undtagelseshåndterere for alle controllere i applikationen, hvilket hjælper med at centralisere fejlhåndtering og undgå kode-duplikering.
Inden for en klasse annoteret med @ControllerAdvice angiver metoder annoteret med @ExceptionHandler, hvilke typer undtagelser en bestemt metode skal håndtere. Dette forenkler fejlhåndtering og gør koden mere overskuelig og organiseret.
GlobalExceptionHandler.java
12345678@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { // error handling } }
Inden for denne klasse vil metoden handleException() blive kaldt, når der opstår en undtagelse af typen ApiException i applikationen. Annotationen @ExceptionHandler(ApiException.class) angiver, at denne metode håndterer undtagelser af denne specifikke type.
Oprettelse af en brugerdefineret undtagelse
Men hvad er egentlig ApiException? Det er en brugerdefineret undtagelse oprettet specifikt til vores API, og vi kan oprette vores egne undtagelser og anvende dem i vores REST API.
Du kan lære om oprettelse af dine egne brugerdefinerede undtagelser her.
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; } }
Denne kode definerer ApiException-klassen, som arver fra RuntimeException og indeholder et ekstra felt httpStatus til lagring af HTTP-status. Klassens konstruktør modtager en besked og en HTTP-status, som derefter sendes til superklassens konstruktør og gemmes i httpStatus-feltet.
Herefter kan vi kaste en undtagelse fra vores applikation:
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); }
Denne type undtagelse vil blive opfanget af en metode handleException(ApiException ex) , der er designet til at håndtere den, og inden for denne metode kan vi definere logikken for håndtering af undtagelsen.
Logikken, vi ønsker at implementere, er at opfange undtagelser relateret til API'et og returnere et struktureret svar, der indeholder fejlinformation sammen med den passende HTTP-status.
Main.java
123456789@ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { return new ResponseEntity<>(ErrorResponse .builder() .error(ex.getMessage()) .build(), ex.getHttpStatus() ); }
Denne kode håndterer ApiException ved at oprette en ResponseEntity med fejlinformation. handleException()-metoden konstruerer et ErrorResponse-objekt med beskeden fra undtagelsen og angiver HTTP-status fra undtagelsens httpStatus-felt, som returneres til klienten.
Vi initialiserede httpStatus-feltet, da vi kastede undtagelsen i vores applikation.
ErrorResponse er en klasse, der bruges til at give information om fejlen. Den indeholder et error-felt, der viser fejlbeskrivelsen og oprettes ved hjælp af annotationerne @Data og @Builder.
ErrorResponse.java
12345@Data @Builder public class ErrorResponse { private String error; }
@Builder-annotationen fra Lombok forenkler objektoprettelse ved at implementere Builder-mønsteret. Det muliggør en mere læsbar og vedligeholdelsesvenlig måde at konstruere objekter på, især dem med mange parametre. For eksempel kan du oprette en ErrorResponse-instans sådan her:
ErrorResponse.builder().error("ERROR").build();
Metoden builder() initialiserer en ny builder for ErrorResponse-klassen. Metoden error("ERROR") sætter error-feltet til "ERROR", og metoden build() konstruerer det endelige ErrorResponse-objekt med den angivne værdi.
Fejlhåndtering i vores applikation
Resumé
Undtagelseshåndtering i et REST API centraliserer fejlhåndtering ved at levere et ensartet responsformat til klienten. Dette forenkler forståelsen og håndteringen af fejl, da klienter modtager klare og strukturerede beskeder.
Brugen af @ControllerAdvice og @ExceptionHandler annotationer muliggør tilpasning af, hvordan forskellige undtagelser håndteres, mens brugerdefinerede undtagelser kan inkludere yderligere information, såsom HTTP-status.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Awesome!
Completion rate improved to 3.45
Undtagelseshåndtering
Stryg for at vise menuen
Undtagelseshåndtering i en REST API ved brug af Spring Boot er et vigtigt aspekt af udviklingen, der muliggør effektiv håndtering af fejl og informerer klienter om problemer, der er opstået på serveren. Lad os undersøge denne proces i mere detalje.
Hvordan hjælper det med at informere klienten om fejl?
Fejlhåndtering i en REST API hjælper med at standardisere formatet af fejlbeskeder, hvilket gør det lettere for klienter at arbejde med beskederne. Dette informerer dem om årsagerne til fejl, hvilket gør det muligt for klienter at forstå, hvad der gik galt, og hvordan de kan rette problemet.
Derudover muliggør sådan håndtering en differentiering mellem typer af fejl, såsom valideringsfejl eller adgangsproblemer, hvilket gør fejlbeskederne mere præcise og brugbare.
Implementering af undtagelseshåndtering ved brug af annoteringer
Spring Boot tilbyder flere værktøjer til håndtering af undtagelser. De vigtigste er annotationerne @ControllerAdvice og @ExceptionHandler.
Annotationen @ControllerAdvice gør det muligt at definere globale undtagelseshåndterere for alle controllere i applikationen, hvilket hjælper med at centralisere fejlhåndtering og undgå kode-duplikering.
Inden for en klasse annoteret med @ControllerAdvice angiver metoder annoteret med @ExceptionHandler, hvilke typer undtagelser en bestemt metode skal håndtere. Dette forenkler fejlhåndtering og gør koden mere overskuelig og organiseret.
GlobalExceptionHandler.java
12345678@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { // error handling } }
Inden for denne klasse vil metoden handleException() blive kaldt, når der opstår en undtagelse af typen ApiException i applikationen. Annotationen @ExceptionHandler(ApiException.class) angiver, at denne metode håndterer undtagelser af denne specifikke type.
Oprettelse af en brugerdefineret undtagelse
Men hvad er egentlig ApiException? Det er en brugerdefineret undtagelse oprettet specifikt til vores API, og vi kan oprette vores egne undtagelser og anvende dem i vores REST API.
Du kan lære om oprettelse af dine egne brugerdefinerede undtagelser her.
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; } }
Denne kode definerer ApiException-klassen, som arver fra RuntimeException og indeholder et ekstra felt httpStatus til lagring af HTTP-status. Klassens konstruktør modtager en besked og en HTTP-status, som derefter sendes til superklassens konstruktør og gemmes i httpStatus-feltet.
Herefter kan vi kaste en undtagelse fra vores applikation:
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); }
Denne type undtagelse vil blive opfanget af en metode handleException(ApiException ex) , der er designet til at håndtere den, og inden for denne metode kan vi definere logikken for håndtering af undtagelsen.
Logikken, vi ønsker at implementere, er at opfange undtagelser relateret til API'et og returnere et struktureret svar, der indeholder fejlinformation sammen med den passende HTTP-status.
Main.java
123456789@ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { return new ResponseEntity<>(ErrorResponse .builder() .error(ex.getMessage()) .build(), ex.getHttpStatus() ); }
Denne kode håndterer ApiException ved at oprette en ResponseEntity med fejlinformation. handleException()-metoden konstruerer et ErrorResponse-objekt med beskeden fra undtagelsen og angiver HTTP-status fra undtagelsens httpStatus-felt, som returneres til klienten.
Vi initialiserede httpStatus-feltet, da vi kastede undtagelsen i vores applikation.
ErrorResponse er en klasse, der bruges til at give information om fejlen. Den indeholder et error-felt, der viser fejlbeskrivelsen og oprettes ved hjælp af annotationerne @Data og @Builder.
ErrorResponse.java
12345@Data @Builder public class ErrorResponse { private String error; }
@Builder-annotationen fra Lombok forenkler objektoprettelse ved at implementere Builder-mønsteret. Det muliggør en mere læsbar og vedligeholdelsesvenlig måde at konstruere objekter på, især dem med mange parametre. For eksempel kan du oprette en ErrorResponse-instans sådan her:
ErrorResponse.builder().error("ERROR").build();
Metoden builder() initialiserer en ny builder for ErrorResponse-klassen. Metoden error("ERROR") sætter error-feltet til "ERROR", og metoden build() konstruerer det endelige ErrorResponse-objekt med den angivne værdi.
Fejlhåndtering i vores applikation
Resumé
Undtagelseshåndtering i et REST API centraliserer fejlhåndtering ved at levere et ensartet responsformat til klienten. Dette forenkler forståelsen og håndteringen af fejl, da klienter modtager klare og strukturerede beskeder.
Brugen af @ControllerAdvice og @ExceptionHandler annotationer muliggør tilpasning af, hvordan forskellige undtagelser håndteres, mens brugerdefinerede undtagelser kan inkludere yderligere information, såsom HTTP-status.
Tak for dine kommentarer!