【问题标题】:Weblogic jndi NameNotFoundException occur with java configJava 配置发生 Weblogic jndi NameNotFoundException
【发布时间】:2016-01-18 03:29:10
【问题描述】:

我一直在寻找这个问题,我无法使用 java config 找到 jndi 数据库。在此之前,我使用 xml 及其工作完美,但在 java config 中它会导致问题;

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 config后,有时系统可以读取数据库但很少发生,直到我清理并重新启动计算机才能找到数据库,但通常它总是触发:

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

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

【问题讨论】:

    标签: spring weblogic spring-java-config


    【解决方案1】:

    我也遇到了同样的问题。如果您使用的是 spring 的 4.x 版本,这可能就是原因。

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

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

    您的数据源实现了 Closeable(因此也实现了 AutoCloseable),并且无论您的 Bean 定义如何,上下文都会始终调用关闭方法

    在这里看到: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 版本的 spring 中,您似乎无法通过设置 destroyMethod 来覆盖此行为。看来此错误已在 4.2 RC1 版本中修复。

    【讨论】:

    • 经过几次测试,问题仍然存在,但至少我明白了问题所在。似乎我的数据源保持关闭并删除 jndi 名称。那我需要继续研究。谢谢!
    • 这个数据源是共享的吗?也许有另一个应用程序破坏了数据源。
    • 不,我正在开发中,只有我一个人在使用它
    • 请注意,起初即使添加了destroyMethod,这也没有解决我的问题。不知道是什么修复了它,但我删除了所有 weblogic 缓存/tmp 文件,刷新了项目/maven,并重新启动了 weblogic,然后这个修复工作了。
    • @KtMack 我不知道它是否是 Weblogic 的“功能”,但是如果您将应用程序部署到 Weblogic,然后您发布更新版本,那么当它开始发布时先前部署的应用程序版本在服务器启动时初始化,然后发布您更新的应用程序。虽然之前的版本仍在部署并且在初始化时,但在修复之前它已经删除了 JNDI 名称,所以当应用程序的新版本进行查找时,它已经消失了
    【解决方案2】:

    我遇到了同样的问题,我解决了问题。我曾经在 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 = "")
    

    它的工作很成功。

    【讨论】:

      【解决方案3】:

      您的数据源似乎尚未部署。您应该为您尝试部署数据源的服务器查找 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)

      【讨论】:

      • 已经尝试过了,但是webapp仍然找不到它,有时它可以正常工作,但是当我恢复为xml时,它就可以正常工作了~
      • 也许我必须在 java config 中添加一些东西?
      • 你能用你在连接池中输入的设置连接你的数据库吗?您可以尝试使用 TOAD。最后,您可以在服务器日志中搜索“”吗?它必须在某处写入错误。
      • 目前我使用xml来避免这个问题,会尝试你的方法,谢谢:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 2017-07-06
      相关资源
      最近更新 更多