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.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
@Order
annotation sur votre configuration des classes pour définir la charge de la commande. Mais c'est étrange parce que le Printemps devrait résoudre bon de commande - merci de vérifier si vous avez bien injecterUserRepository
dansUserDetailsService
J'ai donc été en mesure de résoudre ce problème. Comme il l'a souligné qu'il n'avait rien à voir avec l'ordre de chargement de la configuration des classes (qui a été ma première pensée).
Comme vous pouvez le remarquer, la seule Configuration qui avait un
@ComponentScan
annotation a été l'FooApplication.classLe printemps n'a pas été en mesure de trouver les Dépôts, comme il ne savait pas où les chercher. Fournir la basePackages attribut comme ceci:
à l'TestRepositoryConfig.class a fait le tour ici.