根據您的需要稍微重寫您的配置。如果你真的不需要注入數據源,你可以做這樣的事情。
@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;
}