0

我在使用 Spring 时遇到问题:我正在从 Spring Security 版本迁移。3.2.7.RELEASE4.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 初始化之前,是否有任何解决方案可以正确加载此配置?还是我只是错了并且遗漏了一些明显的东西(也许不是那么)?

4

0 回答 0