2014-03-30 88 views
1

SpringApplicationContextLoader假定應用程序使用100%XML或100%Java配置。這是因爲@ContextConfiguration允許一個類或位置/值的列表,而不是兩個。如果指定了任何值,SpringApplicationContextLoader將忽略創建並啓動SpringApplication的Application類。SpringApplicationContextLoader忽略應用程序類

試圖使用100%Groovy/no-XML寵物項目進行引導,我遇到了上述問題。我的應用程序類有@EnableAutoConfiguration@ComponentScan註解,前者需要Boot來建立一個Web服務器。後來我不得不保留,因爲SPR-11627。另一方面,如果我省略了@ContextConfiguration上的位置/值,則不建立依賴關係(duh!)。

我給出了下面的代碼以及我在本地製作的補丁SpringApplicationContextLoader。如果有更好的方法,請讓我知道。

MovieDatabaseRESTClientIntegrationTest.groovy

RunWith(SpringJUnit4ClassRunner) 
@ContextConfiguration(value = ['classpath:client-config.groovy', 'classpath:integ-test-config.groovy'], 
     loader = PatchedSpringApplicationContextLoader) 
@SpringApplicationConfiguration(classes = MovieDatabaseApplication) 
@WebAppConfiguration 
@IntegrationTest 
class MovieDatabaseRESTClientIntegrationTest { 

MovieDatabaseApplication.groovy

@EnableAutoConfiguration 
@ComponentScan 
class MovieDatabaseApplication { 

SpringApplicationContextLoader.java固定

private Set<Object> getSources(MergedContextConfiguration mergedConfig) { 
     Set<Object> sources = new LinkedHashSet<Object>(); 
     sources.addAll(Arrays.asList(mergedConfig.getClasses())); 
     sources.addAll(Arrays.asList(mergedConfig.getLocations())); 

    /* The Spring application class may have annotations on it too. If such a class is declared on the test class, 
    * add it as a source too. */ 
    SpringApplicationConfiguration springAppConfig = AnnotationUtils.findAnnotation(mergedConfig.getTestClass(), 
      SpringApplicationConfiguration.class); 

    if (springAppConfig != null) { 
     sources.addAll(Arrays.asList(springAppConfig.classes())); 
    } 

    if (sources.isEmpty()) { 
     throw new IllegalStateException(
       "No configuration classes or locations found in @SpringApplicationConfiguration. " 
         + "For default configuration detection to work you need Spring 4.0.3 or better (found " 
         + SpringVersion.getVersion() + ")."); 
    } 
    return sources; 
} 

同時發佈在Spring論壇上。

回答

1

我可能是錯的,但我不認爲有支持beans{}配置@ContextConfiguration@SpringContextConfiguration只是一個擴展。 JIRA中的功能請求將是適當的。此外,從來沒有任何對混合配置格式的支持(至少作爲入口點) - 您必須始終選擇XML或@Configuration,否則請提供您自己的ContextLoader。您也不應該在同一個類上同時使用@ContextConfiguration@SpringContextConfiguration(行爲未定義)。

+0

'beans {}'實際上有一些支持。 GroovyBeanDefinitionReader被調用,它在閱讀簡單文件方面做得很好。目前有一個JIRA開放[SPR-11233](https://jira.spring.io/browse/SPR-11233)提供一流的支持。 因爲這個bug [spring-boot-603](https://github.com/spring-projects/spring-boot/issues/603),我不得不使用'@ ContextConfiguration'和'@ SpringContextConfiguration'。我提交了拉請求。 –

+0

更具體地說,'SpringApplicationContextLoader'不會設置Web配置,除非它找到'@ SpringContextConfiguration'。另一方面,它不支持從'beans {}'加載,所以我也被迫使用'@ ContextConfiguration'。 –

+0

實際上'SpringApplicationContextLoader'不支持'beans {}'的加載,但是你不能混合'classes ='和'locations ='。這是出於歷史原因,並沒有理由不能工作,但它不是一個啓動功能,因爲它與底層的Spring Test實現綁定在一起。 –