如何解决ClassLoader 未能找到我的属性文件
我的问题是当我在 Eclipse 等 IDE 中使用此代码时它运行良好,但是当我在 tomcat 服务器中使用它时它不起作用这是 java servlet 应用程序的一部分(我不使用 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
|_
.
.
.
请你帮忙:)
解决方法
类加载器的 getResourceAsStream
方法不能以斜线开头。
但是,这通常不是正确的 gRAS 方法。您几乎一直想要的(因为线程上下文加载器通常不是您认为的那样,甚至可以是 null
),是类的加载器:
DAOFactory.class.getResourceAsStream(FILE_PROPERTIES);
是您真正想要的,而这个确实想要那个前导斜杠!这会在类路径上的同一个位置查找您想要的文件 DAOFactory.class
,例如在同一个罐子里什么的。如果您不想查看该类所在的位置,则将 java.lang.Class
对象作为参数传递为您应该查找的位置的“上下文”。线程上下文加载器不是一些“神奇地知道去哪里寻找”的角色。
您的代码也充斥着错误和样式错误:
- 您没有使用 try-with-resources 来安全关闭您的资源。
- 您没有遵守命名约定。它是
DaoFactory
,不是 DAOFactory,是DaoConfigurationException
,不是DAOConfigurationException
。 - 全大写没有例外。这是一个例外,“呃,出了点问题,小心,错误,警报!”自然是它固有的,您不需要感叹号或全部大写来进一步强调这一点。
-
Class.forName(driver);
不需要,而且已经 20 年没有出现了。 - 将
SQLException
包装到DaoConfigurationException
以打开连接是不正确的:也许您的配置没有问题,但服务器本身存在问题(例如,它已达到最大同时连接数)。更一般地说,如果该方法的定义本身与 SQL 相关联(有人这样做;您认为名为getConnection
的方法在类java.jdbc.Connection
中返回DaoFactory
对象的方法是什么?答案显然包括“SQL 东西”!) - 那么该方法应该声明为throws SQLException
,并且不需要包装它,特别是将它包装在一个名称可能是谎言的类型中(它可能不是一个配置问题)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。