classloader找不到我的属性文件

xxe27gdn  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(409)

我的问题是,当我在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
  |_ 
      .
      .
      .

请你帮忙:)

jaql4c8m

jaql4c8m1#

这个 getResourceAsStream 类加载器的方法不能以前导斜杠开头。
然而,这通常不是正确的gras方法。您几乎总是想要什么(因为线程上下文加载器通常不是您认为的那样,甚至可以是 null ),是类的加载程序:

DAOFactory.class.getResourceAsStream(FILE_PROPERTIES);

是你真正想要的,而这一个确实想要那个前导斜杠!这将在同一位置查找所需的文件 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 在一个名称可能是谎言的类型中(这可能根本不是配置问题)。

相关问题