Spring で問題に直面しています: Spring Security ver. から移行しています。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 が初期化される前に、この構成を適切にロードするソリューションはありますか? それとも、私は間違っていて、何かが欠けているのですか(そうではないかもしれません)明らかですか?