我在使用 Spring 时遇到问题:我正在从 Spring Security 版本迁移。3.2.7.RELEASE
到4.0.2.RELEASE
. 在旧版本中一切正常,但是在加载时出现问题DataSource
。
让我描述一下架构:
应用程序受到 SAML 和 LDAP 机制的保护(SAML 配置与此处给出的配置非常相似:https ://github.com/vdenotaris/spring-boot-security-saml-sample/blob/master/src/main/java/ com/vdenotaris/spring/boot/security/saml/web/config/WebSecurityConfig.java)。
他们都需要连接到数据库才能获取一些所需的数据。我们使用 MyBatis 和 Spring Mybatis 来获取所需的数据。那就是问题开始的地方。
我的 DAO 配置类如下所示:
@Configuration
@EnableConfigurationProperties
@MapperScan(basePackages = { "pl.myapp" })
public class DaoConfiguration {
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Primary
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSource());
}
@Bean
@Primary
public SqlSessionFactoryBean sqlSessionFactoryBean() {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
// some stuff happens here
return sqlSessionFactoryBean;
}
@Bean
@Primary
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean
@ConfigurationProperties(prefix = "liquibase.datasource")
@ConditionalOnProperty(name="liquibase.enabled")
public DataSource liquibaseDataSource() {
DataSource liquiDataSource = DataSourceBuilder.create().build();
return liquiDataSource;
}
}
在以前的版本中,它就像一个魅力,但现在它在加载映射器时出现问题,导致Bean creation exception on FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'someMapper' defined in file [<filename>]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
一遍又一遍(这不是我的问题,这是一个已知的 Spring/MyBatis 错误)。
我做了一些调试,发现了一些有趣的东西:它看起来不像DaoConfiguration
这里的配置!我的意思是:如果我添加
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
return sqlSessionFactoryBean().getObject();
}
对于这个配置,@Bean
注释方法的“正常”调用应该导致调用正确的拦截器,这里它缺乏这个功能。
我的预测是:这个配置类还没有被正确包装,Spring Security 已经需要它生成的 bean。
在 Spring Security 初始化之前,是否有任何解决方案可以正确加载此配置?还是我只是错了并且遗漏了一些明显的东西(也许不是那么)?