【问题标题】:ClassLoader failed locating my properties fileClassLoader 找不到我的属性文件
【发布时间】:2021-01-02 14:48:42
【问题描述】:

我的问题是当我在 IDE(如 eclipse)中使用此代码时它运行良好,但是当我在 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
  |_ 
      .
      .
      .

请你帮忙:)

【问题讨论】:

    标签: java tomcat javabeans dao servlet-3.0


    【解决方案1】:

    类加载器的getResourceAsStream 方法不能以斜杠开头。

    但是,这通常不是正确的 gRAS 方法。你几乎总是想要的是一个类的加载器(因为线程上下文加载器通常不是你想的那样,甚至可以是null),是一个类的加载器:

    DAOFactory.class.getResourceAsStream(FILE_PROPERTIES);
    

    是你真正想要的,而这个确实想要那个前导斜线!这会在类路径中存在DAOFactory.class 的同一位置查找您想要的文件,例如在同一个罐子里什么的。如果您不想查看该类存在的位置,则将 java.lang.Class 对象作为参数传递为您应该查看的位置的“上下文”。线程上下文加载器不是一些“神奇地知道在哪里看”的伪装。

    你的代码也充满了错误和风格的假通行证:

    1. 您没有使用 try-with-resources 来安全地关闭您的资源。
    2. 您没有遵守命名约定。是DaoFactory,不是DAOFactory,是DaoConfigurationException,不是DAOConfigurationException。
    3. 全大写在例外中没有位置。这是一个例外,“呃,出事了,小心,错误,警报!”自然是它所固有的,您不需要感叹号或全部大写来进一步突出这一点。
    4. Class.forName(driver); 不需要,并且已经有 20 年没有使用了。
    5. 将SQLException 包装到DaoConfigurationException 以打开连接是不正确的:也许您的配置没有问题,但服务器本身存在问题(例如,它已达到最大同时连接数)。更一般地说,如果方法的定义本身与 SQL 相关联(它确实可以做到这一点;你认为名为 getConnection 的方法在类 DaoFactory 中返回一个 java.jdbc.Connection 对象是什么?答案显然包括“SQL 的东西” '!) - 那么方法应该被声明为throws SQLException,并且不需要包装它,尤其是把它包装成一个名字可能是谎言的类型(它可能根本不是配置问题)。李>

    【讨论】:

    • 谢谢你的笔记,但我会说这段代码在 Eclipse 中运行良好,但在 tomcat 服务器(linux 环境)中不起作用,关于你的第五条笔记,我会澄清这个类是实例化的只需一次并使用侦听器存储在上下文中,谢谢:)
    • 这与它是否有效无关。这是关于你的代码是否可读和可维护的。它不是。第 5 个注释是关于 getConnection() 方法的。
    • 是的,先生,我非常感谢您的评论,非常感谢您
    • 先生,我是否应该在类路径中指定我的属性(我使用的是终端没有 IDE)
    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 2011-11-03
    • 2019-05-10
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2012-08-27
    • 2014-07-30
    相关资源
    最近更新 更多