Коротко: странная вещь случается, когда я добавляю build.gradle
spring-boot-starter-security
в свой build.gradle
. Здесь мой дистиллированный код (нет другого кода вообще):
public class App {
public static void main(String[] args) {
try {
SpringApplication.run(AppConfiguration.class, args);
} catch(BeanCreationException e) {
System.out.printf("HURRAY: %s\n", e.getBeanName());
}
}
@Configuration
@EnableAutoConfiguration
@ComponentScan // !!! NOTE: extends WebMvcConfigurerAdapter !!!
public static class AppConfiguration extends WebMvcConfigurerAdapter {
@Autowired
private MyService myService;
}
@Component
public static class MyService {
public MyService() {
throw new RuntimeException("Error");
}
}
}
Вот мой build.gradle
:
dependencies {
testCompile group: "junit", name: "junit", version: "4.11"
compile group: "org.springframework.boot", name: "spring-boot-starter-web", version: "1.0.0.RC5"
// compile group: "org.springframework.boot", name: "spring-boot-starter-security", version: "1.0.0.RC5" // HERE
}
Поведение, которое я ожидаю, заключается в том, что BeanCreationException
будет выброшено, и catch
будет печатать HURRAY
. И это работает так. Странно, когда я пытаюсь добавить зависимость build.gradle
spring-boot-starter-security
в build.gradle
. Как только я раскомментирую эту строку, созданное исключение - ApplicationContextException
. Если я рекурсивно вызову getCause()
, результат будет таким:
org.springframework.context.ApplicationContextException
org.springframework.boot.context.embedded.EmbeddedServletContainerException
org.apache.catalina.LifecycleException
org.apache.catalina.LifecycleException
org.apache.catalina.LifecycleException
Вы можете видеть, нет никакого BeanCreationException
вообще.
Когда я запускаю приложение, журналы четко говорят, что там где-то есть BeanCreationException
.
Есть ли надежный подход, чтобы поймать BeanCreationException
?
BeanCreationException
выбрасывается в другой поток (Spring Security - это фильтр, и фильтры встроены в специальный контейнер). Я не уверен, что мы можем заставить Tomcat использовать основной поток (я попытался один раз и сдался, но это не обязательно означает, что это невозможно). Если вы можете его улучшить, пожалуйста, сделайте предложение в github.
BeanCreationException
когда я переключаюсь на Jetty.
BeanCreationException
потому что что-то пошло не так. Не уверен, что. Можете ли вы показать трассировку стека? (Проигнорируйте это. Только видел журналы.)