@PostConstruct & проверенные исключения
на @PostConstruct doc говорит об аннотированных методах:
" метод не должен вызывать проверенное исключение."
Как бы справиться, например, с IOException, которое может быть брошено в таком методе? Просто оберните его в RuntimeException и позвольте пользователю беспокоиться о неисправном начальном состоянии объекта? Или @PostConstruct-неправильное место для проверки и инициализации объектов,которые получили свои зависимости?
3 ответов
да, оберните его в исключение времени выполнения. Предпочтительнее что-то более конкретное, как IllegalStateException
.
обратите внимание, что если метод init терпит неудачу, обычно приложение не запускается.
используйте смягченное исключение, как так, по сути, обертывание в RuntimeException: https://repl.it/@djangofan/SoftenExceptionjava
private static RuntimeException softenException(Exception e) {
return checkednessRemover(e);
}
private static <T extends Exception> T checkednessRemover(Exception e) throws T {
throw (T) e;
}
тогда использование похоже на:
} catch (IOException e) {
throw softenException(e);
//throw e; // this would require declaring 'throws IOException'
}
в целом, если вы хотите или ожидаете сбой запуска приложения, когда один из ваших бобов выдает исключение, вы можете использовать@SneakyThrows
.
Это невероятно полезно и лаконично при правильном использовании:
@SneakyThrows
@PostConstruct
public void init() {
// I usually throw a checked exception
}
есть недавняя запись, обсуждающая свои плюсы и минусы здесь:предпочитают Ломбок @SneakyThrows переосмысление проверенных исключений как RuntimeExceptions
наслаждайтесь!