我一直在寻找这个问题,我无法使用java配置找到jndi数据库。在此之前我使用xml及其工作完美但在java配置中它会导致问题;
Xml代码:
<!-- Jndi database connection -->
<jee:jndi-lookup id="dbDataSource" jndi-name="${db.jndi}"
resource-ref="true" />
<beans:bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate" >
<beans:property name="dataSource" ref="dbDataSource"></beans:property>
</beans:bean>
现在Java配置:
@Bean(name = "dbDataSource")
public DataSource dataSource(@Value("${db.jndi}") String jndiName)
{
JndiDataSourceLookup lookup = new JndiDataSourceLookup();
return lookup.getDataSource(jndiName);
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource ds) {
return new JdbcTemplate(ds);
}
属性文件:
db.jndi=jndi/myData
weblogic中的JNDI名称:
jndi/myData
更改为java配置后,有时系统可以读取数据库但很少发生,直到我清理并重新启动计算机然后它才能找到数据库,但通常它总是触发:
javax.naming.NameNotFoundException: Unable to resolve 'jndi.myData'. Resolved 'jndi'; remaining name 'myData'
为什么应用程序无法正确找到数据库? 感谢!!!
答案 0 :(得分:5)
我遇到了同样的问题。如果您使用的是弹簧的4.x版本可能是原因。
您还应该check Weblogic's JNDI Tree。如果重建项目后数据源从树中消失,那就是另一种症状
如果是这种情况,发生的事情是:
您的数据源实现了Closeable(因此也是AutoCloseable),无论您的Bean定义如何,上下文总是会调用shutdown方法
它被标记为文档问题,因为这是“预期”行为:
这个问题完全是关于文档的,因为我们决定不在框架级实现任何东西
解决方案是将bean的destroy方法定义为空,例如:
@Bean(name = "dbDataSource", destroyMethod="")
public DataSource dataSource(@Value("${db.jndi}") String jndiName)
{
JndiDataSourceLookup lookup = new JndiDataSourceLookup();
return lookup.getDataSource(jndiName);
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource ds) {
return new JdbcTemplate(ds);
}
这在issue (SPR-13022:Destroy callback cannot be disabled for AutoCloseable beans) 中有描述。
PS:顺便说一句,看起来像早期的4.x版春天,你无法通过assing destroyMethod来覆盖这种行为。它表明此错误已在版本4.2 RC1上修复。
答案 1 :(得分:1)
我有同样的问题,我解决了问题。我曾经在weblogic上使用过jndi数据源。重新启动应用程序后,我注意到我的jndi数据源已从Weblogic的JNDI树中删除。 Xml配置成功运行,但java配置不起作用。
我的旧春季版本:4.1.6.RELEASE升级到4.3.9.RELEASE
像这样的Xml配置;
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>${db-jndi.name}</value>
</property>
</bean>
像这样的Java配置;
@Bean(name = "dataSource")
public DataSource dataSource() throws IllegalArgumentException, NamingException
{
JndiTemplate jndiTemplate = new JndiTemplate();
DataSource dataSource = (DataSource) jndiTemplate.lookup(env.getProperty("db-jndi.name"));
logger.info("DataSource initialized in jndi ");
return dataSource;
}
然后我改变了
@Bean(name = "dataSource")
到
@Bean(name = "dataSource", destroyMethod = "")
它的成功运作。
答案 2 :(得分:0)
看起来您的数据源尚未部署。您应该为尝试部署数据源的服务器查找JNDI树。 (https://docs.oracle.com/cd/E12839_01/apirefs.1111/e13952/taskhelp/jndi/ViewObjectsInTheJNDITree.html)如果在JNDI树上没有看到“jndi.myData”,则可以假定尚未部署数据源。因此,您可以转到数据源监视选项卡并测试数据源。 (https://docs.oracle.com/cd/E17904_01/apirefs.1111/e13952/taskhelp/jdbc/jdbc_datasources/TestDataSources.html)