Я не понимаю, как мне обрабатывать исключение контроллера в Spring Boot Rest API. Прямо сейчас я выбрасываю некоторые исключения в своих классах обслуживания, например:
public Optional<Item> getSpecificItem(Long itemId) throws Exception {
return Optional.ofNullable(itemRepository.findById(itemId).
orElseThrow(() -> new Exception("Item with that id doesn't exist")));
}
Я не знаю, правильный ли это способ сделать это, но он работает, я открыт для критики. Что касается классов контроллеров, я не знаю, как это должно выглядеть, я видел пример с @ControllerAdvice и исключениями для каждого контроллера, и мне это показалось плохим. Могу ли я иметь глобальный класс исключений для всех контроллеров? Это хорошая практика?
Видел несколько примеров, и я не знаю, были ли они правильным способом сделать это.




@ControllerAdvice хорошо, если вы не используете для общего исключения. Например, если вы определяете исключение спецификации, такое как SkyIsRedException. Таким образом, он будет брошен везде, где он поймает.
@ControllerAdvice
public class ExampleAdvice {
@ExceptionHandler(SkyIsRedException.class)
@ResponseCode(HttpStatus.NOT_FOUND) // <- not required
public void methodName1() { ... }
@ExceptionHandler(SkyIsGreenException.class)
public void methodName2() { ... }
}
И вы также можете это @ExceptionHandler в контроллере, так что он активируется, если какой-либо метод контроллера вызовет это SkyIsRedException.
Я не рекомендую использовать Exception для всего. Вы только вредите себе.
ОБНОВИТЬ:
// annotations
public class Controller {
// annotations
public Optional<Item> getSpecificItem(Long itemId) throws ItemNotExistException {
return Optional.ofNullable(itemRepository.findById(itemId).
orElseThrow(() -> new ItemNotExistException("Item with that id doesn't exist")));
}
// Controller specific exception handler, not central like @ControllerAdvice
@ExceptionHandler(ItemNotExistException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String itemNotExistExceptionHandler(ItemNotExistException ex) {
return ex.getMessage(); // example
{
}
В моем пакете контроллера у меня обычно есть класс ControllerAdvice, удобный для обработки всех исключений в одном месте. По умолчанию вы должны просто добавить туда перехватчик исключений и, возможно, вернуть код ответа 500.
Хорошее исключение для «Предмета с таким идентификатором не существует» называется NoSuchElementException. И вы можете указать подкатегории, такие как ItemNotExistException extends NoSuchElementException. И вы обрабатываете это исключение. Таким образом, вы можете отделить обработку ошибок. Я изменил исходный ответ.
Итак, когда я должен использовать Exception, в каких ситуациях?