Spring Boot Java Config — разделенная сеть (контроллеры и т. д.) и сервисы

В моих старых проектах конфигурации XML я мог сделать следующее в своих конфигурациях

mvc-context.xml

<context:component-scan base-package="com.foo" use-default-filters="false">
    <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>

<mvc:annotation-driven/>

service-context.xml

<context:spring-configured />
<context:annotation-config />

<context:component-scan base-package="com.foo" >
    <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>

в моих тестах я мог бы сделать следующее

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextHierarchy(value = {
    @ContextConfiguration(classes = { MockServices.class }),
    @ContextConfiguration({ "classpath:/META-INF/spring/mvc-servlet-context.xml" }),
})
public class FooControllerTest {
    @Autowired
    private WebApplicationContext wac;

    private MockMvc mvc;

    @Before
    public void setUp() throws Exception {
        mvc = webAppContextSetup(wac).build();
    }
}

и затем я мог бы запускать тесты с моей конфигурацией MVC, не загружая свои сервисы и репозитории JPA, и вместо этого иметь мои макеты @Autowired в моих контроллерах.

Однако приложения Spring Boot имеют следующую конфигурацию основного контекста.

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
}

Этот @ComponentScan, очевидно, находит все @Controller, @Service и т. д.

если бы я сейчас попытался проверить свой контекст MVC, я бы загрузил нежелательные сервисы и репозитории.

То, что я пытался сделать, это создать 2 новые конфигурации

Mvc.java

@Configuration
@ComponentScan(basePackages = { "com.foo" }, useDefaultFilters = false, includeFilters = {@Filter(value = org.springframework.stereotype.Controller.class)} )
@Order(2)
public class Mvc {
}

Services.java

@Configuration
@ComponentScan(basePackages = { "com.foo" }, useDefaultFilters = false, excludeFilters = {@Filter(value = org.springframework.stereotype.Controller.class)} )
@Order(1)
public class Services {
}

Однако это не работает, когда я пытаюсь запустить свое приложение, я получаю @Autowire ошибок No qualifying bean of type

Я иду об этом неправильно?

Как мне сделать так, чтобы я мог запускать тесты в моем контексте MVC без потери времени на загрузку JPA EntityManagers, Spring Data Repositories и т. д.?


person kabal    schedule 23.10.2014    source источник
comment
не могли бы вы указать ошибку стека, чтобы мы могли устранить неполадки   -  person Aeseir    schedule 24.10.2014
comment
Вы слишком много копируете. Удалите атрибут useDefaultFilters из класса Services. Также вам действительно нужен контекст, если все, что вы хотите сделать, это протестировать контроллер, просто создайте экземпляр самостоятельно и смоделируйте службы, необходимые в вашем модульном тесте, и/или используйте Spring Test MockMVC для тестирования ваших контроллеров.   -  person M. Deinum    schedule 24.10.2014
comment
Не уверен, при чем тут копипаст, наверняка без useDefaultFilters и excludeFilters контроллеры будут загружаться дважды? использование MockMvcBuilders.standaloneSetup приемлемо, за исключением того, что оно не будет включать в себя все остальные вещи, используемые MVC, например, ControllerAdvice, ExceptionResolvers, ConversionServices и т. д. Вот почему я хочу использовать MockMvcBuilders.webAppContextSetup. Я обновил приведенный выше код, чтобы показать, что   -  person kabal    schedule 24.10.2014


Ответы (1)


Решение M. Deinum дал в комментариях правильно, но, возможно, вы не поняли намек. когда вы говорите: useDefaultFilters = false и excludeFilters = {@Filter(value = org.springframework.stereotype.Controller.class)} ничего не будет найдено, потому что useDefaultFilters = false не позволит Spring искать стереотипные аннотации, такие как @Controller, @Service ...

Ссылка на Документация по Spring API

person meistermeier    schedule 24.10.2014
comment
После прочтения исходного кода ComponentScanAnnotationParser это действительно имеет смысл. Мне интересно, как на самом деле работает моя конфигурация xml, потому что она также включает useDefaultFilter=false с excludeFilters - person kabal; 24.10.2014