Spring 3.1.1 から 3.2.6 に更新しました
3.1 では、次のコードがうまく機能しました。
@Bean(name = DEMO_DS)
public JndiObjectFactoryBean demoDataSource()
{
JndiObjectFactoryBean factory = new JndiObjectFactoryBean();
factory.setJndiName(JDBC_DEMO_DS);
factory.setProxyInterface(DataSource.class);
return factory;
}
@Bean(name = DEMO_SESSION_FACTORY)
public SqlSessionFactoryBean demoSqlSessionFactory(@Qualifier(DEMO_DS) DataSource dataSource)
{
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setConfigLocation(new ClassPathResource("demo/config.xml"));
return sessionFactory;
}
ただし、アップグレードされたバージョンでは、次の例外が発生します。
原因: org.springframework.beans.factory.NoSuchBeanDefinitionException: 依存関係に該当するタイプ [javax.sql.DataSource] の Bean が見つかりません: この依存関係のオートワイヤー候補として適格な Bean が少なくとも 1 つ必要です。依存アノテーション: {@org.springframework.beans.factory.annotation.Qualifier(value=DemoDataSource)}
複数の DataSources があるため、 @Qualifier が必要です。
ありがとう。
編集:
これで問題が解決したようです:
public DataSource dataSourceFactory() {
try
{
return (DataSource) demoDataSource().getObject();
}
catch (Exception ex)
{
throw new RuntimeException(ex);
}
}
...
sessionFactory.setDataSource(dataSourceFactory());
しかし、私はそれが良い解決策だとは思いません。