Przechwytywanie błędów w Spring Boot

Przechwytywanie wyjątków w Spring Boocie zrealizowane jest z użyciem programowania aspektowego (z ang. AOP). Sposób ten jest zdecydowanie zalecaną metoda która pozwala oddzielić logikę biznesową od obsługi błędów. Do dzieła! Tworzymy projekt Spring Boota – niezbędne zależności – plik pom.xml:

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
 
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

RestController:

@RestController
public class Calculator {
 
    @GetMapping("/add/{a}/{b}")
    int add(@PathVariable int a, @PathVariable int b){
        return a+b;
    }
 
    @GetMapping("/subtract/{a}/{b}")
    int subtract(@PathVariable int a, @PathVariable int b){
        return a-b;
    }
 
    @GetMapping("/multiply/{a}/{b}")
    int multiply(@PathVariable int a, @PathVariable int b){
        return a*b;
    }
 
    @GetMapping("/divide/{a}/{b}")
    int divide(@PathVariable int a, @PathVariable int b) {
        if(b == 0) {
            throw new DivisionByZeroException("division by zero!");
        }
        return a/b;
    }
}

Wyjątek – dzielenie przez zero:

public class DivisionByZeroException extends RuntimeException {
    public DivisionByZeroException(String message) {
        super(message);
    }
}

Klasa przechwytująca wyjątek – adnotacja @ControllerAdvice odpowiedzialna jest za oznaczanie klas które posiadają metody do przechwytywania konkretnych błędów, adnotacja @ExceptionHandler odpowiedzialna jest z kolei za oznaczanie metod odpowiedzialnych za konkretną obsługę danego błędu:

@ControllerAdvice
public class DivisionByZeroHandleException extends ResponseEntityExceptionHandler {
    @ExceptionHandler(DivisionByZeroException.class)
    public ResponseEntity<Object> handleWebExeption(RuntimeException e, WebRequest webRequest) {
        return handleExceptionInternal(e, e.getMessage(), HttpHeaders.EMPTY, httptatus.BAD_REQUEST, webRequest);
    }
}

W momencie kiedy podamy nieprawidłowe dane które sprowokują błąd dzielenia przez zero:

http://localhost:8091/divide/2/0

w przeglądarce uzyskamy po przechwyceniu przez Spring Boota błędu przygotowany komunikat:

division by zero!

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.

Zobacz też film na YouTube!

Leave a comment

Your email address will not be published.


*