gpt4 book ai didi

Java Class.forName() 不起作用,从属性文件加载类字符串

转载 作者:行者123 更新时间:2023-12-02 03:00:59 30 4
gpt4 key购买 nike

我在 Eclipse 中有一个简单的 Java 项目,它可以连接到多个数据库,并且正在尝试修改它以允许从属性文件配置连接参数。

在当前阶段,我有一个工作DBHelper类,它提供了一个getDatabaseConnection()方法,返回使用硬编码实例化的Connection项参数。

我正在尝试创建一个类似的类,它执行相同的操作,但从属性文件中读取参数。

它被称为PropertyParser并提供getDBConnection()方法。

事实是,如果从后者调用,Class.forName() 方法会失败,即使属性文件中保存的所有连接数据都完全相同硬编码在DBHelper 类,两者都引用完整的类名 (oracle.jdbc.driver.OracleDriver)。

这是我的代码。

老 worker 类(Class):

package mypath.helpers;
import java.sql.Connection;
import java.sql.DriverManager;

public class DBHelper {
public static Connection getDatabaseConnection(){

String dbClass = "oracle.jdbc.driver.OracleDriver";
String dbUrl = "jdbc:oracle:thin:@host:port/service";
String dbUser = "user";
String dbPass = "pass";

// connect to DB
try {
Class.forName(dbClass);
Connection con = DriverManager.getConnection(dbUrl, dbUser, dbPass);
con.setAutoCommit(false);
return con;

} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

新的非 worker 类(Class):

package mypath.helpers;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class PropertyParser extends Properties{

// variables
private static String propFile = "conf/myprops.properties";
private static String dbClassProp = "DBCLASS";
private static String dbUrlProp = "DBURL";
private static String dbUserProp = "DBUSER";
private static String dbPassProp = "DBPASS";

// constructor
public PropertyParser() throws FileNotFoundException, IOException{

super();
this.load(new FileInputStream(propFile));
}

public Connection getDBConnection() throws SQLException, ClassNotFoundException{

// read properties
String JDBCClass = this.getProperty(dbClassProp).trim() ;
String JDBCUrl = this.getProperty(dbUrlProp).trim();
String JDBCUserId = this.getProperty(dbUserProp).trim();
String JDBCPasswd = this.getProperty(dbPassProp).trim();

Class.forName(JDBCClass);
Connection con = DriverManager.getConnection(JDBCUrl, JDBCUserId, JDBCPasswd);
con.setAutoCommit(false);

return con;
}
}

这是主要的,两个调用:

public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException, SQLException {
// this works fine
Connection con = DBHelper.getDatabaseConnection();
System.out.println("Everything works fine till now.");

// this does not work
PropertyParser pp = new PropertyParser();
Connection con2 = pp.getDBConnection();
System.out.println("I will never reach this point.");
}

这是我得到的输出:

Everything works fine till now.
Exception in thread "main" java.lang.ClassNotFoundException: "oracle.jdbc.driver.OracleDriver"
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at mypath.helpers.PropertyParser.getDBConnection(PropertyParser.java:35)
at mypath.GetConnection.main(GetConnection.java:20)

ojdbc.jar 文件配置在项目的构建路径中。有办法实现结果吗?

最佳答案

双引号。您不必在属性值中添加双引号。

所以它:DBCLASS=oracle.jdbc.driver.OracleDriver

而不是DBCLASS="oracle.jdbc.driver.OracleDriver"

关于Java Class.forName() 不起作用,从属性文件加载类字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42365527/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com