@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

наслаждайтесь!