Bug记录

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图:


报错图片.png

原因:

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


image.png

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


jsp测试.png

运行结果:


运行结果.png

成功拿到连接对象!

上一篇 下一篇

猜你喜欢

热点阅读