SpringApplicationContextLoader忽略Application类

时间:2014-03-30 09:19:13

标签: rest groovy spring-boot

SpringApplicationContextLoader假定应用程序使用100%XML或100%Java配置。这是因为@ContextConfiguration允许列表或位置/值,而不是两者。如果指定了any,SpringApplicationContextLoader将忽略创建并启动SpringApplication的Application类。

尝试使用100%Groovy / no-XML宠物项目启动Boot,我遇到了上述问题。我的Application类上有@EnableAutoConfiguration@ComponentScan注释,前者需要Boot来设置Web服务器。后来我因为SPR-11627而不得不保留。另一方面,如果我省略@ContextConfiguration上的位置/值,则不会设置依赖关系(呃!)。

我将以下代码与我在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 个答案:

答案 0 :(得分:1)

我可能错了,但我认为beans{}中的@ContextConfiguration配置没有任何支持,@SpringContextConfiguration只是对此的扩展。 JIRA中的功能请求是合适的。此外,从未有过对混合配置格式的支持(至少作为入口点) - 您始终必须选择XML或@Configuration,否则提供您自己的ContextLoader。您也不应该在同一个类上同时拥有@ContextConfiguration@SpringContextConfiguration(行为未定义)。