2014-06-18 14 views
18

Sto lavorando con spring-boot su un progetto multi-modulo (maven). Ogni modulo ha la sua classe @Configuration. Fondamentalmente Io ho il seguente layoutCome imporre l'ordine di caricamento delle classi di configurazione primaverili?

modulo foo-embedded (corre appena chiama lo SpringApplication.run()) Metodo:

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

modulo foo-comune (contiene tutti i fagioli e l'inizializzazione primavera-dati-JPA config)

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

modulo foo-sicurezza (contenente configurazione molla securiy e classi di dominio correlate), che ha una dipendenza maven su foo-common

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

Quando avvio l'applicazione utilizzando la classe FooApplication, tutto funziona come previsto. Il summenzionato UserDetailsServiceImpl viene attivato con il mio UserRepository che viene creato tramite l'annotazione @EnableJpaRepositories.

Poiché desidero scrivere alcuni test di integrazione, ho aggiunto un test clss a uno dei miei moduli.

modulo foo-media (contenente alcuni casi cose relative dominio più di prova per quel modulo)

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

Quando eseguo il test sembra che il SecurityConfiguration get caricato prima della RepositoryConfig.class fa. Dal momento che la configurazione di sicurezza definito l'UserServiceImpl che deve essere autowired, il test non viene avviato con un

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

ho già provato ad aggiungere @DependsOn("UserRepository") alla definizione di fagioli di UserDetailsService, dicendomi che la primavera non riesce a trovare un fagiolo da quel nome

Qualsiasi suggerimento o aiuto sarebbe molto apprezzato! Grazie in anticipo!

---- EDIT (da quando mi è stato chiesto di fornire più codice) ----

Per le prove io non uso il RepositoryConfig.class vero e proprio, ma hanno un TestRepositoryConfig.class nel comune modulo. Guardando come questa

@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

Prova esplicitamente il nome del fagiolo 'RepositoryConfig' facendo' @Configuration ("RepositoryConfig") 'e poi fare' @DependsOn ("RepositoryConfig") ' –

+0

che purtroppo non ha aiutato. Tuttavia da quello che ho capito ora è che l'ordine non è rilevante. All'avvio non riesce a trovare i repository poiché non ci sono pacchetti base definiti da cercare. L'aggiunta di @EnableJpaRespositores (basePackages = {"de.foobar.rootpacke"}) mi ha fornito almeno gli archivi. Fornirò una configurazione completa una volta eseguita correttamente – Markus

+0

Puoi pubblicare un piccolo codice compilabile, che ti riporti il ​​problema? Una possibile ragione: manca '@ComponentScan (" de.foobar.rootpackage ")' sulla classe di test. –

risposta

5

Quindi sono stato in grado di risolvere questo. Come ha sottolineato, non aveva nulla a che fare con l'ordine di caricamento delle classi di configurazione (che era il mio primo pensiero).

Come si può notare, l'unica configurazione che ha avuto un'annotazione @ComponentScan era il FooApplication.class primavera non è stato in grado di trovare i repository, in quanto non sapeva dove cercare. Fornire le basePackages attribuiscono in questo modo:

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

al TestRepositoryConfig.class ha fatto il trucco qui.

7

È possibile utilizzare @Order annotazione sulle vostre classi di configurazione per definire il carico ordinazione. Ma è strano perché Spring dovrebbe risolvere l'ordine corretto - quindi per favore controlla se la tua proprietà si inietta UserRepository in UserDetailsService

Problemi correlati