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!
Leave a comment