Weblogic jndi使用java配置发生NameNotFoundException

Fre*_*ezY 2 spring weblogic spring-java-config

我一直在寻找这个问题,我无法使用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>
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

属性文件:

db.jndi=jndi/myData
Run Code Online (Sandbox Code Playgroud)

weblogic中的JNDI名称:

jndi/myData
Run Code Online (Sandbox Code Playgroud)

更改为java配置后,有时系统可以读取数据库但很少发生,直到我清理并重新启动计算机然后它才能找到数据库,但通常它总是触发:

javax.naming.NameNotFoundException: Unable to resolve 'jndi.myData'. Resolved 'jndi'; remaining name 'myData'

为什么应用程序无法正确找到数据库?谢谢!!!

Tia*_*ega 5

我有同样的问题.如果你使用4.x版本的弹簧可能是原因.

您还应该检查Weblogic的JNDI树.如果重建项目后数据源从树中消失,那就是另一种症状

如果是这样的话,发生的事情是:

您的数据源实现了Closeable(因此也是AutoCloseable),无论您的Bean定义如何,上下文总是会调用shutdown方法

如下所示:SPR-12551:记录如何防止在关闭上下文时删除使用JavaConfig检索的JNDI DataSource

它被标记为文档问题,因为这是"预期"行为:

这个问题完全是关于文档的,因为我们决定不在框架级别实现任何东西

解决方案是将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);
}
Run Code Online (Sandbox Code Playgroud)

这个问题本期中有所描述(SPR-13022:无法为AutoCloseable bean禁用Destroy回调).

PS:顺便说一下,似乎在早期的4.x版春天,你无法通过assing destroyMethod来覆盖这种行为.它表明此错误已在版本4.2 RC1上修复.