Каждый раз, когда генерируется исключение (uncaught), SpringBoot возвращает Http-500 Internal Server Error
. В Spring есть много способов обработки исключений.
Допустим, у меня есть контроллер, и я неявно выкидываю исключение.
@RestController
public class HelloWorldController {
@GetMapping("/hello-world")
public String helloWorld() {
throw new MyCustomException("I just can't say hello!");
}
}
Он такой же, как ваш - вы можете указать что угодно в исключении.
First:
Один из способов справиться с этим - создать класс с аннотацией @ControllerAdvice
.
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(MyCustomException.class)
public ResponseEntity<String> handlyMyCustomException(MyCustomException e) {
logger.error("error occurred {}", e);
return new ResponseEntity<>("Something happened: " + e.getMessage(), HttpStatus.I_AM_A_TEAPOT);
}
}
Таким образом, вы можете перехватить исключение по вашему выбору (глобально) и вернуть сообщение с состоянием ответа HTTP по вашему выбору, а не обязательно I_AM_A_TEAPOT
Второй:
@ExceptionHandler(MyCustomException.class)
public ResponseEntity<String> handlyMyCustomException(MyCustomException e) {
logger.error("error occurred {}", e);
return new ResponseEntity<>("Something happened: " + e.getMessage(), HttpStatus.I_AM_A_TEAPOT);
}
Вы также можете создать только метод, помеченный @ExceptionHandler
в вашем классе контроллера - но это не глобально и будет работать только для этого точного вызова контроллера.
Результат ниже:
Третье:
Другой способ справиться с исключениями - создать собственные файлы ошибок .html
. Если вы поместите файл в resources/static/error/500.html
, он должен быть возвращен при выдаче Http-500 Internal Server Error
.