JNDI 位置 [comp/env/test] 上可用的 [class java.util.Properties] 类型的对象不可分配给 [javax.sql.DataSource]

Posted

技术标签:

【中文标题】JNDI 位置 [comp/env/test] 上可用的 [class java.util.Properties] 类型的对象不可分配给 [javax.sql.DataSource]【英文标题】:Object of type [class java.util.Properties] available at JNDI location [comp/env/test] is not assignable to [javax.sql.DataSource] 【发布时间】:2018-12-18 21:53:59 【问题描述】:

我需要将 Spring MVC 应用程序连接到 oracle 数据库 throw Glassfish 服务器。

这是我的 MVCconfiguration.java

@Bean
public DataSource getDataSource() throws SQLException 

    //Option 1 it works
    //DriverManagerDataSource dataSource = new DriverManagerDataSource();
    //dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
    //dataSource.setUrl("jdbc:oracle:thin:@xxx.xx.xx.xx:1521:dtest");
    //dataSource.setUsername("user");
    //dataSource.setPassword("pass");    

    //Option 2 didn't work
    JndiObjectFactoryBean bean = new JndiObjectFactoryBean(); 
    DataSource dataSource = null;
    JndiTemplate jndi = new JndiTemplate();
    try 
    dataSource = jndi.lookup("comp/env/test", DataSource.class);
     catch (NamingException e) 
    


    //Option 3 didn't work
    JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
    DataSource dataSource = (DataSource) dataSourceLookup.getDataSource("comp/env/test");              

    return dataSource;        


glassfish中有一个jdbc资源和jndi自定义资源

但是当我部署战争文件时,我得到了这个错误:

【问题讨论】:

根据你的第一张截图comp/env/test 一个属性对象。换句话说,您不能将其用作数据源。现在您只定义了池,但您还需要定义一个使用该池的 JDBC 资源,然后将其引用为 comp/env/jdbc/<resourcename> 【参考方案1】:

JNDI 自定义资源是一个 java.util.properties JDBC资源与JDBC连接池相关(可以是javax.sql.datasource

去掉 JNDI 自定义资源,改用 JDBC 资源

【讨论】:

以上是关于JNDI 位置 [comp/env/test] 上可用的 [class java.util.Properties] 类型的对象不可分配给 [javax.sql.DataSource]的主要内容,如果未能解决你的问题,请参考以下文章

JNDI

在扩展的 BasicDataSource 对象上使用 JNDI

如何在使用 JNDI 的应用程序中查找数据源 [重复]

JavaEE--JNDI(上,简介)

列出远程机器上 jndi 中所有条目的代码

JNDI基础