Добавление Spring Security в качестве зависимости приводит к тому, что приложение ведет себя по-разному

1

Коротко: странная вещь случается, когда я добавляю 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?

  • 0
    Я предполагаю, что нет BeanCreationException потому что что-то пошло не так. Не уверен, что. Можете ли вы показать трассировку стека? (Проигнорируйте это. Только видел журналы.)
Теги:
spring-boot
spring-security
spring
tomcat

1 ответ

1
Лучший ответ

BeanCreationException выбрасывается в другой поток (Spring Security - это фильтр, и фильтры встроены в специальный контейнер). Я не уверен, что мы можем заставить Tomcat использовать основной поток (я попытался один раз и сдался, но это не обязательно означает, что это невозможно). Если вы можете его улучшить, пожалуйста, сделайте предложение в github.

  • 0
    Спасибо, Дэйв. Одна интересная вещь, которую я только что обнаружил, заключается в том, что эта «проблема» (проблема?) Появляется только при использовании Tomcat. Он правильно BeanCreationException когда я переключаюсь на Jetty.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню