2016-02-22 94 views
1

我在使用Spring Boot MVC和Spring的ServletRegistrationBean在我的数据源配置之前被调用,它在StandardContext中加载。Spring安全无法找到数据源

WebSecurityConfig总是被首先调用,因此决不会为Autowired prodDatasource定义一个bean。

我试过从@Order@ConditionalOnMissingBean的所有内容。我一直无法找到一个体面的解释。但我需要一个Bean为数据源创建它运行WebSecurity

应用程序(使用AutoConfigurations)

@EnableAutoConfiguration 
@SpringBootApplication 
@EnableCaching 
public class Application { 


    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @Bean 
    public CacheManager cacheManager() { 
     return new ConcurrentMapCacheManager("appInfo"); 
    } 

} 

PrimaryDataSource前

@Configuration 
@PropertySource({ "classpath:application.properties" }) 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackages = "App.Models", 
     entityManagerFactoryRef = "prodEntityManager", 
     transactionManagerRef = "transactionManager" 
) 
public class PrimaryDatasourceConfig { 

    @Autowired 
    private Environment env; 

    @Bean 
    @ConfigurationProperties(prefix = "spring.datasource.prod") 
    public DataSource prodDataSource() { 
     EmbeddedDatabaseFactory factory = new EmbeddedDatabaseFactory(); 
     factory.setDatabaseName("spring-social-quickstart"); 
     factory.setDatabaseType(EmbeddedDatabaseType.H2); 
     return factory.getDatabase(); 
    } 
} 

WebSecurityConfig

@Configuration 
@EnableWebSecurity 
@Import(PrimaryDatasourceConfig.class) 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private DataSource prodDataSource; 

    SuperiorUserService jdbcDao; 

....... 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
       .jdbcAuthentication() 
       .dataSource(prodDataSource); 
     auth.authenticationProvider(authProvider()); 
    } 

} 

回答

0

嗯,我想出了一个似乎有所帮助的解决方案。

而不是在我的Spring Security中使用@Autowire。我用@Resource替换了它们,它似乎等待我的bean被首先创建。