javax.naming.NoInitialContextException错误的解决方案
Posted 花伤情犹在
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javax.naming.NoInitialContextException错误的解决方案相关的知识,希望对你有一定的参考价值。
在用dbcp配置数据源时,写了一个测试类,在测试类中调用了dbcp获得数据库连接报错:javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or in an application resource file: java.naming.factory.initial
检查依赖的jar包是否导入:
commons-dbcp2-2.8.0.jar
commons-pool2-2.10.0.jar
mysql8.0jar包
mysql5.0jar包
Test代码:
package test;
import org.junit.Test;
import tools.DataSourceUtil;
import java.sql.Connection;
public class test {
@Test
public void test(){
Connection connection = DataSourceUtil.getConnection();
System.out.println(connection);
}
}
数据库源代码:
package tools;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class DataSourceUtil {
// 获取连接
public static Connection getConnection() {
// ctrl + alt + t ---选6
// 实例化初始上下文的对象
Connection connection = null;
try {
InitialContext initialContext = new InitialContext();
// 获取配置中的数据,得到object对象
Object lookup = initialContext.lookup("java:comp/env/jdbc/easybuy");
// 拆箱强转得到连接池
DataSource ds = (DataSource) lookup;
// 让连接池给我一个连接
connection = ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
// 返回连接
return connection;
}
// 关闭连接
public static void closeConnection(Connection connection) {
if (connection != null) {
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
Bug图:
原因:
在用DBCP连接数据库时用main函数测试时总报错,InitialContext 是要在web应用服务器的上下文里才有的。而配置文件在web目录下,很明显要initialContext要想访问到配置文件必须运行在web服务器上才可以连接到数据库拿到连接对象
不能用main函数直接测试,只能放到tomcat或者servlet、jsp显示
运行结果:
#成功拿到连接对象!
以上是关于javax.naming.NoInitialContextException错误的解决方案的主要内容,如果未能解决你的问题,请参考以下文章