javax.naming.NoInitialContextExc
2021-06-29 本文已影响0人
花伤情犹在
在用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
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显示

运行结果:
