2014-06-18 5 views
18

Я работаю с весенним сапогом в проекте с несколькими модулями (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 
    } 
} 
+1

Попробуйте явно указать компонент 'RepositoryConfig', выполнив' @Configuration («RepositoryConfig») ', а затем выполните' @DependsOn («RepositoryConfig») ' –

+0

Это, к сожалению, не помогло. Однако из того, что я сейчас понял, этот порядок не имеет значения. При запуске он не может найти репозитории, поскольку нет базовых пакетов, определенных для поиска. Добавление @EnableJpaRespositores (basePackages = {"de.foobar.rootpacke"}) дало мне репозитории, по крайней мере. Я обеспечу полную конфигурацию после правильной работы – Markus

+0

Можете ли вы опубликовать небольшой компилируемый код, который воспроизводит вашу проблему? Одна из возможных причин - отсутствует '@ComponentScan (« de.foobar.rootpackage »)' на тестовом классе. –

ответ

5

Так что я смог это решить. Как он отметил, это не имеет никакого отношения к порядку загрузки классов конфигурации (это была моя первая мысль).

Как вы можете заметить, единственной конфигурацией, в которой была аннотация @ComponentScan, была FooApplication.class . Spring не смог найти репозитории, так как не знал, где искать. Обеспечивая атрибут basePackages так:

@EnableJpaRepositories(basePackages = "de.foobar.rootpackage") 

на TestRepositoryConfig.class сделал трюк здесь.

7

Вы можете использовать @Order аннотацию на классах конфигурации, чтобы определить порядок загрузки. Но это странно, потому что весна должна решить правильный порядок - поэтому, пожалуйста, проверьте, введен ли вам свойство впрыскивать UserRepository в UserDetailsService

Смежные вопросы