2014-03-28 65 views
1

簡而言之:奇怪的事情發生在我將spring-boot-starter-security添加到我的build.gradle時。這裏是我的蒸餾水代碼(有沒有其他代碼的話):將Spring Security添加爲依賴項導致應用程序的行爲不同

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依賴項時。一旦我取消註釋該行,拋出的異常是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可言。

當我運行的應用程序,the logs clearly say那裏有一個BeanCreationException某處。

有沒有可靠的方法來捕獲BeanCreationException

+0

我想沒有'BeanCreationException'因爲別的事情出錯了。不知道是什麼。你能顯示堆棧跟蹤嗎? (忽略它,只看到了日誌。) –

回答

1

BeanCreationException被引發到另一個線程中(Spring Security是一個過濾器,過濾器在嵌入式容器中以特殊方式初始化)。我不確定我們可以強制Tomcat使用主線程(我嘗試過一次並放棄了,但這並不意味着它不可能)。如果你可以改進它,請在github中提出建議。

+0

謝謝戴夫。我剛剛發現的一件有趣的事情是,這個「問題」(問題?)僅在使用Tomcat時出現。當我切換到Jetty時,它正確地拋出'BeanCreationException'。 – agibalov

相關問題