我刚刚更新了Spring3.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,它可以作为此依赖项的自动选择。依赖性注释:{@org.springframework.beans.factory.annotation.Qualifier(value=DemoDataSource)}
我有多个DataSources,因此@限定符是必需的。
谢谢。
编辑:
这似乎解决了这个问题:
public DataSource dataSourceFactory() {
try
{
return (DataSource) demoDataSource().getObject();
}
catch (Exception ex)
{
throw new RuntimeException(ex);
}
}
...
sessionFactory.setDataSource(dataSourceFactory());不过,我不认为这是个好办法。
发布于 2013-12-17 11:22:01
根据您的需要,稍微重写一下您的配置。如果你真的不需要注入数据源,你可以这样做。
@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() {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(demoDataSource().getObject());
sessionFactory.setConfigLocation(new ClassPathResource("demo/config.xml"));
return sessionFactory;
}如果需要注入数据源,则可能需要切换到使用JndiLocatorDelegate来进行查找,而不是使用JndiObjectFactoryBean。
@Bean(name = DEMO_DS)
public DataSource demoDataSource() throws NamingException {
return JndiLocatorDelegate.createDefaultResourceRefLocator().lookup(JDBC_DEMO_DS, DataSource.class);
}这直接给您提供了一个DataSource,而不是FactoryBean<Object> ( JndiObjctFactoryBean是什么),问题的根源可能是什么。
或者(理论上)您还应该能够对配置类中的属性使用@Value注释。与@Value不同,普通的@Resource也应该完成这个任务(也可以将调用委托给JNDI进行查找)。
public class MyConfig {
@Value("${" + JDBC_DEMO_DS + "}")
private DataSource demoDs;
}用@Resource
public class MyConfig {
@Resource(mappedName=JDBC_DEMO_DS)
private DataSource demoDs;
}然后,您可以简单地在配置方法中引用它。
@Bean(name = DEMO_SESSION_FACTORY)
public SqlSessionFactoryBean demoSqlSessionFactory() {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(demoDs);
sessionFactory.setConfigLocation(new ClassPathResource("demo/config.xml"));
return sessionFactory;
}https://stackoverflow.com/questions/20630742
复制相似问题