Я работаю с весенним сапогом в проекте с несколькими модулями (maven). Каждый модуль имеет свой собственный класс @Configuration. В принципе у меня есть следующий макетКак обеспечить порядок загрузки классов конфигурации весны?
Модуль Foo встраиваемый (прогонов просто называет) 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-общий (содержит все бобы и пружинно-данных 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-безопасности (содержащий пружинный securiy конфигурацию и связанные с ними классы домена), который имеет Maven зависимость от Foo-общей
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// configuring HTTP security and defining my UserDetailsService Bean
}
Когда я запускаю приложение с использованием класса FooApplication, все работает так, как ожидалось. Вышеупомянутый UserDetailsServiceImpl get autwired с моим UserRepository, который создается через аннотацию @EnableJpaRepositories.
Поскольку я хочу написать некоторые интеграционные тесты, я добавил тестовый clss в один из моих модулей.
Модуль Foo-медиа (содержащий несколько доменов связанных вещей плюс тестовые случаев для этого модуля)
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {RepositoryConfig.class, SecurityConfig.class})
@WebAppConfiguration
@IntegrationTest
public class DirectoryIntegrationTest {
// my test code
}
Когда я запускаю тест, кажется, что SecurityConfiguration получить заряжена до RepositoryConfig.class делает. Поскольку конфигурации безопасности определены UserServiceImpl, который должен быть autowired, тест не запускается с
NoSuchBeanDefinitionException telling me: No qualifying bean of type [com.foo.rootpackage.security.repository.UserRepository]
я уже пытался добавить @DependsOn("UserRepository")
на определении бобов UserDetailsService
, говорит мне, что весной не может найти компонент по это имя.
Любые подсказки или помощь были бы очень признательны! Заранее спасибо!
---- EDIT (с меня попросили предоставить больше кода) ----
Для тестирования я не использую фактическое 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
}
}
Попробуйте явно указать компонент 'RepositoryConfig', выполнив' @Configuration («RepositoryConfig») ', а затем выполните' @DependsOn («RepositoryConfig») ' –
Это, к сожалению, не помогло. Однако из того, что я сейчас понял, этот порядок не имеет значения. При запуске он не может найти репозитории, поскольку нет базовых пакетов, определенных для поиска. Добавление @EnableJpaRespositores (basePackages = {"de.foobar.rootpacke"}) дало мне репозитории, по крайней мере. Я обеспечу полную конфигурацию после правильной работы – Markus
Можете ли вы опубликовать небольшой компилируемый код, который воспроизводит вашу проблему? Одна из возможных причин - отсутствует '@ComponentScan (« de.foobar.rootpackage »)' на тестовом классе. –