我正在一个多模块项目(maven)上使用
spring-boot.每个模块都有自己的@Configuration类.基本上我确实有如下的布局
模块嵌入式(运行只调用SpringApplication.run())方法:
@Configuration
@EnableAutoConfiguration
@ComponentScan("de.foobar.rootpackage")
@Import({ApplicationConfig.class, RepositoryConfig.class, SecurityConfig.class})
public class FooApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(FooApplication.class, args);
}
}
模块foo-common(包含所有的bean和spring-data-jpa初始化配置)
@Configuration
@EnableJpaRepositories
@EnableTransactionManagement(entityManagerFactoryRef="entityManagerFactory")
public class RepositoryConfig {
@Bean(destroyMethod = "shutdown")
public DataSource getDataSource() {
// returning a Hikari CP here
}
@Bean(name = "entityManagerFactory") // overriding spring boots default
public EntityManagerFactory getEntityManagerFactory() {
// returning a new LocalEntityManagerFactoryBean here
}
}
模块foo-security(包含spring-securiy配置和相关的域类),它具有对foo-common的maven依赖
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// configuring HTTP security and defining my UserDetailsService Bean
}
当我使用FooApplication类启动应用程序时,一切正常工作.上面提到的UserDetailsServiceImpl可以通过@EnableJpaRepositories注释创建的UserRepository自动连线.
由于我想编写一些集成测试,所以我已经在我的一个模块中添加了一个测试clss.
模块foo-media(包含一些域相关的东西加上该模块的测试用例)
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {RepositoryConfig.class, SecurityConfig.class})
@WebAppConfiguration
@IntegrationTest
public class DirectoryIntegrationTest {
// my test code
}
当我运行测试时,似乎SecurityConfiguration在RepositoryConfig.class之前被加载.由于安全配置定义了必须自动连线的UserServiceImpl,所以测试无法从a开始
NoSuchBeanDefinitionException telling me: No qualifying bean of type [com.foo.rootpackage.security.repository.UserRepository]
我已经尝试在UserDetailsService的bean定义中添加@DependsOn(“UserRepository”),告诉我spring不能通过该名称找到一个bean.
任何提示或帮助将不胜感激!提前致谢!
—-编辑(因为被要求提供更多的代码)—-
对于测试,我不使用实际的RepositoryConfig.class,但在公共模块中有一个TestRepositoryConfig.class.看起来像这样
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory", basePackages = "de.foobar.rootpackage")
public class TestRepositoryConfig extends RepositoryConfig {
@Bean
@Override
public DataSource getDataSource() {
// returning the ds for testing
}
}