Spring Boot Java Config - 拆分Web(控制器等)和服务

时间:2014-10-23 22:42:27

标签: spring spring-mvc spring-boot spring-test-mvc

在我的旧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等的时间损失?

1 个答案:

答案 0 :(得分:0)

评论中给出的解决方案M. Deinum是正确的,但可能是你没有得到提示。 当你说: useDefaultFilters = falseexcludeFilters = {@Filter(value = org.springframework.stereotype.Controller.class)} 什么都找不到,因为useDefaultFilters = false会阻止Spring寻找像@Controller, @Service ...

这样的刻板印象注释

Link to Spring API doc