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图:
报错图片.png

原因:

在用DBCP连接数据库时用main函数测试时总报错,InitialContext 是要在web应用服务器的上下文里才有的。而配置文件在web目录下,很明显要initialContext要想访问到配置文件必须运行在web服务器上才可以连接到数据库拿到连接对象
image.png

不能用main函数直接测试,只能放到tomcat或者servlet、jsp显示
jsp测试.png

运行结果:
运行结果.png

#成功拿到连接对象!

以上是关于javax.naming.NoInitialContextException错误的解决方案的主要内容,如果未能解决你的问题,请参考以下文章