Найти в Дзене
Java

Spring Boot: уберите try/catch из контроллеров

В Spring Boot не нужно размазывать обработку ошибок по каждому endpoint через бесконечные try/catch. Для этого есть @RestControllerAdvice. Идея простая: вы выносите обработку исключений в один глобальный класс, а контроллеры оставляете чистыми. Например: @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity<?> handleNotFound(ResourceNotFoundException ex) { return ResponseEntity .status(HttpStatus.NOT_FOUND) .body(new ErrorResponse("NOT_FOUND", ex.getMessage())); } @ExceptionHandler(IllegalArgumentException.class) public ResponseEntity<?> handleBadRequest(IllegalArgumentException ex) { return ResponseEntity .badRequest() .body(new ErrorResponse("BAD_REQUEST", ex.getMessage())); } @ExceptionHandler(Exception.class) public ResponseEntity<?> handleGeneric(Exception ex) { return ResponseEntity .status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("INTERNAL_ERROR", "Something went wrong")); } }

Spring Boot: уберите try/catch из контроллеров

В Spring Boot не нужно размазывать обработку ошибок по каждому endpoint через бесконечные try/catch.

Для этого есть @RestControllerAdvice.

Идея простая: вы выносите обработку исключений в один глобальный класс, а контроллеры оставляете чистыми.

Например:

@RestControllerAdvice

public class GlobalExceptionHandler {

@ExceptionHandler(ResourceNotFoundException.class)

public ResponseEntity<?> handleNotFound(ResourceNotFoundException ex) {

return ResponseEntity

.status(HttpStatus.NOT_FOUND)

.body(new ErrorResponse("NOT_FOUND", ex.getMessage()));

}

@ExceptionHandler(IllegalArgumentException.class)

public ResponseEntity<?> handleBadRequest(IllegalArgumentException ex) {

return ResponseEntity

.badRequest()

.body(new ErrorResponse("BAD_REQUEST", ex.getMessage()));

}

@ExceptionHandler(Exception.class)

public ResponseEntity<?> handleGeneric(Exception ex) {

return ResponseEntity

.status(HttpStatus.INTERNAL_SERVER_ERROR)

.body(new ErrorResponse("INTERNAL_ERROR", "Something went wrong"));

}

}

После этого контроллер может выглядеть спокойно:

@GetMapping("/users/{id}")

public User getUser(@PathVariable Long id) {

return userService.findById(id);

}

Если пользователь не найден - сервис кидает ResourceNotFoundException, а Spring сам отправит нормальный 404.

Что это даёт:

• меньше мусора в контроллерах

• единый формат ошибок

• проще поддерживать API

• легче логировать исключения

• меньше копипасты в endpoint-ах

Контроллер должен описывать сценарий запроса, а не превращаться в свалку обработки ошибок.