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