NamingContext无法强制转换为数据源?

时间:2014-04-14 05:03:10

标签: java tomcat derby

您好,我有一个数据库连接类。这个类是动态Web项目的一部分我在本地运行tomcat服务器上的web项目,我也尝试连接到derby服务器。我已经为derby和tomcat导入了所有外部文件,两台服务器都在运行。当我在这条线上运行我的应用程序时,我一直都在失败

ds = (DataSource) ctx.lookup("java:/comp/env");

这些是我导入的软件包

import java.sql.Connection;
import java.sql.SQLException;
import java.util.logging.Logger;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

这是代码

的摘录
public DatabaseConnection() throws ServiceLocatorException{
try{
            ctx = new InitialContext();
            System.out.println("We are trying to connect to the Derby server: ");
            ds = (DataSource) ctx.lookup("java:/comp/env");
            logger.info("Database found:"+ds.toString());
        }catch(NamingException e){
            logger.severe("Cannot find context, throwing exception"+e.getMessage());
            e.printStackTrace();
            throw new ServiceLocatorException();
        }
}

我得到的例外是

java.lang.ClassCastException: org.apache.naming.NamingContext cannot be cast to javax.sql.DataSource

我不知道该怎么做。

2 个答案:

答案 0 :(得分:0)

我希望你在web.xml中添加了资源引用条目。

此外,在您的Web应用程序中,您确实包含了META-INF / context.xml文件。

答案 1 :(得分:0)

我遇到了这个问题,并在搜索引擎周围进行了搜索,没有找到答案。

问题在于,如果输入的数据库名称/资源名称为空,则ctx.lookup的返回对象将是NamingContext而不是DataSource。

您可以使用

javax.naming.NamingEnumeration dsList = envCtx.list(""java:/comp/env"); 

查看此查询已返回什么。

应该正确:

ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/myDb"); //- make sure myDb exists

-R / z2SU上有一个关于此问题的博客,希望以后由Apache Tomcat Dev团队解决。