Spring-Boot: попытка создать пользовательское исключение RunTimeException из метода @PostConstruct не удалась

В основном, код, который у меня есть, приведен ниже. Учтите, что это «тестовое» состояние кода. Первоначальная проблема заключалась в вызове init() другого класса, который выдавал проверенное исключение. Этот бросок был перехвачен блоком try/catch, после чего приложение не удалось создать исключение. Все это было удалено для ясности, так как проблема заключалась в создании «MyCustomRuntimeException».

@Component
public class ClassName {

  public ClassName() {
    //minor, non problematic operations.
  }

  @PostConstruct
  public void init() {
    throw new MyCustomRuntimeException("AAAAAAAH");
  }

}

MyCustomRuntimeException определяется следующим образом:

public class MyCustomRuntimeException extends RuntimeException {

  public MyCustomRuntimeException (String message) {
    super(message);
  }
}

И я получаю «UnsatisfiedDependencyException» при создании класса, который использует этот класс. Консоль указывает на строку, в которой создается новое исключение MyCustomRuntimeException, и я действительно не понимаю, что происходит.

Кроме того, «MyCustomRuntimeException» запускается как обычное исключение, но я увидел, что вместо этого я должен генерировать RunTimeException, потому что @PostConstruct запрещает проверенные исключения, которые будут выброшены. И я также безуспешно пытался создать стандартное исключение RunTimeException.

Так что тут я не в курсе. Любые идеи о том, почему я не могу бросить это исключение?


person Neuromante    schedule 19.03.2020    source источник
comment
Я тестировал, и я могу бросить RuntimeException (или пользовательское исключение) в проекте весенней загрузки в методе @postconstruct. Я думаю, вам нужно сосредоточиться на UnsatisfiedDependencyException и его вызванном разделе.   -  person classeswilldullyourmind    schedule 19.03.2020
comment
Что, по вашему мнению, произойдет? Ваш bean-компонент не может быть создан из-за исключения, тогда другой bean-компонент, который зависит от этого, не может получить зависимость от этого bean-компонента, потому что он никогда не создавался? Так что я не вижу проблемы, и это действительно работает так, как должно.   -  person M. Deinum    schedule 19.03.2020
comment
@ M.Deinum Ах, ты прав. Я неправильно понял, как Spring обрабатывает создание bean-компонента, и почему-то думал, что при запуске он не выйдет из строя. Я могу полностью принять это как ответ, если вы хотите написать это как правильный ответ, спасибо!   -  person Neuromante    schedule 19.03.2020


Ответы (1)


Каждый компонент в контексте должен быть правильно создан. Когда возникает ошибка, создание bean-компонентов останавливается/не удается, и контекст (или, другими словами, ваше приложение) не запускается.

Вы получаете UnsatisfiedDependencyException из-за того, что bean-компонент ClassName создан, потому что он нужен другому bean-компоненту. После создания ClassName он вызовет @PostConstruct компонента ClassName, что не удается из-за исключения. Следовательно, экземпляр не создается, поэтому UnsatisfiedDependencyException.

Основной причиной UnsatisfiedDependencyException будет исключение, вызванное вашим собственным методом инициализации.

person M. Deinum    schedule 19.03.2020