我的问题是,当我在ide(如eclipse)中使用这段代码时,它工作得很好,但当我在tomcat服务器中使用它时,它不工作这是javaservlet应用程序的一部分(我不使用maven或spring…)
public class DAOFactory {
private final static String PROPERTY_DRIVER = "driver";
private final static String PROPERTY_USER_NAME = "userName";
private final static String PROPERTY_PASSWD = "passwd";
private final static String PROPERTY_DB_NAME = "dbName";
private final static String PROPERTY_URL = "url";
private final static String FILE_PROPERTIES = "/com/DAO/dbInfos.properties";
private String url;
private String passwd;
private String userName;
/**
*
* @param url
* @param passwd
* @param userName
*/
public DAOFactory(String url,String passwd,String userName)
{
this.url = url;
this.passwd = passwd;
this.userName = userName;
}
/**
*
* @return
* @throws DAOConfigurationException
*/
public static DAOFactory getInstance()throws DAOConfigurationException
{
Properties properties = new Properties();
String passwd;
String url;
String userName;
String driver ;
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream input = loader.getResourceAsStream(FILE_PROPERTIES);
if(input == null)
throw new DAOConfigurationException("properties file not exist EXCEPTION");
try
{
properties.load(input);
url = properties.getProperty(PROPERTY_URL);
passwd = properties.getProperty(PROPERTY_PASSWD);
userName = properties.getProperty(PROPERTY_USER_NAME);
driver = properties.getProperty(PROPERTY_DRIVER);
}
catch(IOException e)
{
throw new DAOConfigurationException("properties file loading EXCEPTION ",e);
}
try
{
Class.forName(driver);
}
catch(ClassNotFoundException e)
{
throw new DAOConfigurationException("------------- driver loading error ",e);
}
return new DAOFactory(url,passwd,userName);
}
public Connection getConnection()throws DAOConfigurationException
{
try
{
return DriverManager.getConnection(url,userName,passwd);
}catch(SQLException e)
{
throw new DAOConfigurationException("connection failed to be created",e);
}
}
/**
*
* @return
*/
public UniteDAO getUnite()
{
return new UniteImplDAO(this);
}
}
总是在上面的if语句中抛出“properties file not exist exception”消息
包的层次结构是
src
|_ com
|_ DAO
|_ DAOFactory
|_ dbInfos.properties
WEB-INF
|_
.
.
.
请你帮忙:)
1条答案
按热度按时间jaql4c8m1#
这个
getResourceAsStream
类加载器的方法不能以前导斜杠开头。然而,这通常不是正确的gras方法。您几乎总是想要什么(因为线程上下文加载器通常不是您认为的那样,甚至可以是
null
),是类的加载程序:是你真正想要的,而这一个确实想要那个前导斜杠!这将在同一位置查找所需的文件
DAOFactory.class
存在于类路径上,例如,在同一个jar或诸如此类的东西中。如果不想查看类存在的位置,则作为参数传递java.lang.Class
对象作为您应该查找的位置的“上下文”。线程上下文加载器不是什么“只是神奇地知道去哪里看”的逃避。您的代码中也充斥着错误和样式错误:
您没有使用try with资源来安全关闭资源。
您没有坚持命名约定。它是
DaoFactory
,而不是工厂DaoConfigurationException
,不是DAOConfigurationException
.所有的大写字母都没有例外。这是个例外,“哦,出了什么事,小心,错误,警报!”自然是与生俱来的,你不需要感叹号或所有的大写字母来进一步强调这一点。
Class.forName(driver);
已经20年没用了。Package
SQLException
变成一个DaoConfigurationException
因为打开连接是不正确的:也许您的配置没有问题,但是服务器本身有问题(例如,它已达到最大同时连接数)。更一般地说,如果方法的定义固有地将自己与sql联系在一起(一个人会这样做;你认为一个叫做getConnection
返回一个java.jdbc.Connection
对象,在类中DaoFactory
是吗?答案显然包括了“sql stuff”!)-然后应该将该方法声明为throws SQLException
,并且不需要 Package 它,特别是将它 Package 在一个名称可能是谎言的类型中(这可能根本不是配置问题)。