Comment appliquer ordre de chargement de configuration spring classes?

Je suis travailler avec spring-boot sur un multi projet de module (maven). Chaque module a sa propre @classe de Configuration. Fondamentalement, je dois avoir la présentation suivante

Module foo-embedded (fonctionne appelle la SpringApplication.run()) méthode:

@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);
    }
}

Module foo-commune (contient tous les haricots et spring-data-jpa de l'initialisation de la configuration)

@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
    }
}

Module foo-sécurité (contenant printemps-securiy de configuration et de domaines connexes classes), qui a une dépendance maven sur foo-commune

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //configuring HTTP security and defining my UserDetailsService Bean
}

Quand je démarre l'application à l'aide de la FooApplication classe, tout fonctionne comme prévu. Le ci-dessus mentionné UserDetailsServiceImpl est autocâblés avec mon UserRepository qui est en cours de création par le biais de l' @EnableJpaRepositories annotation.

Depuis que j'ai envie d'écrire quelques tests d'intégration, j'ai ajouté un test de satc à l'un de mes modules.

Module foo-médias (contenant de domaine liés à des trucs plus des cas de test pour ce module)

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {RepositoryConfig.class, SecurityConfig.class})
@WebAppConfiguration
@IntegrationTest
public class DirectoryIntegrationTest {
    //my test code
}

Quand je lance le test, il semble que le SecurityConfiguration est chargé avant le RepositoryConfig.class n'. Depuis la sécurité config défini le UserServiceImpl qui doit être autocâblés, le test ne parvient pas à démarrer avec un

NoSuchBeanDefinitionException telling me: No qualifying bean of type [com.foo.rootpackage.security.repository.UserRepository]

J'ai déjà essayé d'ajouter @DependsOn("UserRepository") à la fève définition de UserDetailsService, me disent que le printemps ne peut pas trouver un haricot de ce nom.

Tous conseils ou de l'aide serait grandement appréciée! Merci à l'avance!

---- MODIFIER (depuis que j'ai été prié de fournir plus de code) ----

Pour le test je n'utilise pas le réel RepositoryConfig.class mais, avoir un TestRepositoryConfig.class dans le module commun. Ressembler à ce

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory", basePackages = "de.foobar.rootpackage")
public class TestRepositoryConfig extends RepositoryConfig {

    @Bean
    @Override
    public DataSource getDataSource() {
        //returning the ds for testing
    }
}
  • Essayez explicitement le nom de la RepositoryConfig bean en faisant @Configuration("RepositoryConfig") et puis ne @DependsOn("RepositoryConfig")
  • Qui, malheureusement, n'a pas aidé. Cependant à partir de ce que j'ai compris, c'est que l'ordre n'est pas pertinent. Au démarrage, c'est à défaut de trouver les dépôts, car il n'existe pas de paquets de base définis à la recherche pour. L'ajout de @EnableJpaRespositores(basePackages = {"de.foobar.rootpacke"}) m'a donné les référentiels au moins. Je vais vous donner une configuration complète une fois qu'il tourne correctement
  • Vous pouvez poster des petites code compilable, que de reproduire votre problème? L'une des raisons - manque @ComponentScan("de.foobar.rootpackage") sur la classe de test.
InformationsquelleAutor Markus | 2014-06-18