Weblogic jndi使用java配置发生NameNotFoundException

时间:2016-01-18 03:29:10

标签: 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>

现在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'

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

3 个答案:

答案 0 :(得分:5)

我遇到了同样的问题。如果您使用的是弹簧的4.x版本可能是原因。

您还应该check Weblogic's JNDI Tree。如果重建项目后数据源从树中消失,那就是另一种症状

如果是这种情况,发生的事情是:

  

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

如此处所示:SPR-12551: Document how to prevent a JNDI DataSource retrieved using JavaConfig to be removed on shutdown of the context

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

  

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

解决方案是将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