читать файл .properties в статическом коде веб-приложения JSF - PullRequest
2 голосов
/ 01 апреля 2012

Я хотел бы получить параметры подключения к БД из файла свойств в статическом блоке. Расположение файла свойств WEB-INF/classes/db.properties.

Я предпочитаю использовать getResourceAsStream() метод. Я пробовал много способов, но все они вернулись null.

private static Properties prop = new Properties();
static{
    try {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();
        InputStream inputStream = servletContext.getResourceAsStream("/db.properties"); 
        InputStream is = prop.getClass().getResourceAsStream("/db.properties");
        if(inputStream!=null){//it is null
            prop.load(inputStream);
        }
        if(is!=null){//it is null
            prop.load(is);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Как это вызвано и как я могу решить?

Ответы [ 2 ]

1 голос
/ 17 октября 2012
InputStream inputStream = servletContext.getResourceAsStream("/db.properties"); 

В этой попытке предполагается, что файл находится в /WebContent/db.properties.

InputStream is = prop.getClass().getResourceAsStream("/db.properties");

В этой попытке предполагается, что он находится как минимум в том же архиве (JAR), что и класс java.util.Properties.

Ни одна из этих попыток не читает файл, который вы поместили в /WEB-INF/classes/db.properties.Вы можете решить эту проблему в основном двумя способами.

  1. Переместите его непосредственно в папку /WEB-INF как /WEB-INF/db.properties и загрузите его следующим образом:

    InputStream input = externalContext.getResourceAsStream("/WEB-INF/db.properties");
    

    (обратите внимание, что вам не нужно извлекать ServletContext из-под колпаков JSF; для этого уже есть метод делегата)

  2. Загрузить его относительнокласс, который также присутствует в /WEB-INF/classes, например, текущий класс управляемых бинов.

    InputStream input = Bean.class.getResourceAsStream("/db.properties");
    

    Или просто используйте контекстный загрузчик классов, у него есть доступ ко всему.

    InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
    

    (обратите внимание на отсутствие префикса /)

См. Также:

1 голос
/ 16 октября 2012

Как написал Thufir в комментарии, есть хорошее руководство по чтению свойств из кода Java: http://jaitechwriteups.blogspot.ca/2007/01/how-to-read-properties-file-in-web.html

/** 
 * Some Method 
 *  
 * @throws IOException 
 *  
 */  
public void doSomeOperation() throws IOException {  
    // Get the inputStream  
    InputStream inputStream = this.getClass().getClassLoader()  
            .getResourceAsStream("myApp.properties");  

    Properties properties = new Properties();  

    System.out.println("InputStream is: " + inputStream);  

    // load the inputStream using the Properties  
    properties.load(inputStream);  
    // get the value of the property  
    String propValue = properties.getProperty("abc");  

    System.out.println("Property value is: " + propValue);  
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...