Saturday, 15 March 2014

java - How to enforce loading order of spring configuration classes? -



java - How to enforce loading order of spring configuration classes? -

i'm working spring-boot on multi module project (maven). each module has it's own @configuration class. have next layout

module foo-embedded (runs calls springapplication.run()) method:

@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-common (contains beans , spring-data-jpa initialization config)

@configuration @enablejparepositories @enabletransactionmanagement(entitymanagerfactoryref="entitymanagerfactory") public class repositoryconfig { @bean(destroymethod = "shutdown") public datasource getdatasource() { // returning hikari cp here } @bean(name = "entitymanagerfactory") // overriding spring boots default public entitymanagerfactory getentitymanagerfactory() { // returning new localentitymanagerfactorybean here } }

module foo-security (containing spring-securiy configuration , related domain classes), has maven dependency on foo-common

@configuration @enablewebsecurity @enableglobalmethodsecurity(prepostenabled = true) public class securityconfig extends websecurityconfigureradapter { // configuring http security , defining userdetailsservice bean }

when start application using fooapplication class, works expected. above mentioned userdetailsserviceimpl get's autowired userrepository beingness created through @enablejparepositories annotation.

since want write integration tests i've added test clss 1 of modules.

module foo-media (containing domain related stuff plus test cases module)

@runwith(springjunit4classrunner.class) @springapplicationconfiguration(classes = {repositoryconfig.class, securityconfig.class}) @webappconfiguration @integrationtest public class directoryintegrationtest { // test code }

when run test seems securityconfiguration get's loaded before repositoryconfig.class does. since security config defined userserviceimpl must autowired, test fails start a

nosuchbeandefinitionexception telling me: no qualifying bean of type [com.foo.rootpackage.security.repository.userrepository]

i tried add together @dependson("userrepository") @ bean definition of userdetailsservice, telling me spring can't find bean name.

any hints or help appreciated! in advance!

---- edit (since asked provide more code) ----

for testing not utilize actual repositoryconfig.class, have testrepositoryconfig.class in mutual module. looking this

@configuration @enabletransactionmanagement @enablejparepositories(entitymanagerfactoryref = "entitymanagerfactory", basepackages = "de.foobar.rootpackage") public class testrepositoryconfig extends repositoryconfig { @bean @override public datasource getdatasource() { // returning ds testing } }

you can utilize @order annotation on configuration classes define load ordering. it's unusual because spring should resolve proper order - please check if property inject userrepository in userdetailsservice

java spring maven spring-boot

No comments:

Post a Comment