微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ClassLoader 未能找到我的属性文件

如何解决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 对象作为参数传递为您应该查找的位置的“上下文”。线程上下文加载器不是一些“神奇地知道去哪里寻找”的角色。

您的代码也充斥着错误和样式错误:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。