2016-12-01 4 views
0

Я пытаюсь прочитать и написать файл свойств со всеми подключениями к серверу и базе данных в моем проекте веб-приложений JSF в eclipse. Я использую log4j для записи на консоль. Мой config.properties файл:Почему мой файл свойств не обновлен в моем проекте веб-приложений?

dbserver=localhost 
dbname=mydatabase;instance=myinstance 
dbuser=myuser 
dbpassword=mypassword 

Я разместил свой файл config.properties в папке/WebAPP WEB-INF/классов (это путь к классам не так ли?). Я проверил, что он правильно читает файл в этом конкретном месте, потому что если я удалю файл, он сломается.

В моем управляемом компоненте у меня есть функции для чтения и записи в файл config.properties.

public void getSettings() { 
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    InputStream input = classLoader.getResourceAsStream("config.properties"); 
    Properties properties = new Properties(); 
    try { 
     properties.load(input); 
     this.server = properties.getProperty("dbserver"); 
     this.db = properties.getProperty("dbname"); 
     this.user = properties.getProperty("dbuser"); 
     this.pass = properties.getProperty("dbpassword"); 
     logger.info("Config file successfully loaded!");    
    } catch (IOException e) { 
     logger.error("Loading Database Settings Error with " + e); 
    } finally { 
     if (input != null) { 
      try { 
       input.close(); 
       logger.info("Closing config file..."); 
      } catch (IOException e) { 
       logger.error("Error closing config file with " + e); 
      } 
     } 
    } 
} 

public void saveSettings() { 
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    Properties props = new Properties(); 
    OutputStream out = null; 
    try { 
     props.setProperty("dbserver", this.server); 
     props.setProperty("dbname", this.db); 
     props.setProperty("dbuser", this.user); 
     props.setProperty("dbpassword", this.pass); 
     URL url = classLoader.getResource("config.properties"); 
     File file = null; 
     try { 
      file = new File(url.toURI().getPath()); 
     } catch (URISyntaxException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     // File f = new File("config.properties"); 
     out = new FileOutputStream(file); 
     props.store(out, "This is an optional header comment string"); 
     logger.info("Config file successfully saved!"); 
    } catch (IOException io) { 
     logger.error("Saving configuration properties failed error with : " + io.getMessage()); 
    } finally { 
     if (out != null) { 
      try { 
       logger.info("Closing config file..."); 
       out.close(); 
      } catch (IOException e) { 
       logger.error("Failed closing configuration properties file error with : " + e); 
      } 
     } 
    } 
} 

У меня никогда не было проблемы с чтением из файла свойств, но мне было трудно записывать файл. Этот вопрос, казалось, была решена путем указания

URL url = classLoader.getResource("config.properties"); 

Теперь, если я изменю имя сервера «локальный» на «192.168.1.1», я могу видеть, что новая информация сохраняется, даже если я обновить страницу или перезапустите сервер. ОДНАКО ... когда я открываю файл config.properties, я все еще вижу

dbserver=localhost 

, когда я ожидал увидеть

dbserver=192.168.1.1 

информация, кажется, сохраняется где-то еще, даже если файл по-прежнему остается одна и та же? Как и где я могу получить доступ к содержимому своих свойств, чтобы увидеть изменения, которые он делает?

+0

JSF ничего не знает о (re) загрузке файлов свойств таким образом. Таким образом, ваш вопрос не связан с jsf. _ «Я поместил файл config.properties в папку webapp/WEB-INF/classes (это правильный путь к классу?). Я« _ Нет, вот где это должно закончиться. Скорее всего, место находится в папке src (например, src/main/resources при использовании maven) – Kukeltje

+0

Большое спасибо за вашу помощь. Я все еще пытаюсь переварить то, что вы сказали, но это открыло мне глаза. –

ответ

0

Изменение файла WAR является плохой идеей (например, некоторые веб-серверы могут заметить изменения Файловые перераспределять приложение, могут возникнуть проблемы, когда сервер взрывает войну развертывания и т.д.)

Я предложить применение альтернативного подхода - некоторые возможности:

Плейс свойства в таблице базы данных, поэтому они могут быть легко изменены

использовать внешний файл свойств для переопределения настроек файлов «Property.prop». Вы можете сделать это, например, следующим образом. Предположим, что значения свойств по умолчанию включены в вашу WAR, а измененные значения сохраняются на какой-то другой путь, который определяется с использованием системного свойства - пусть он называется CONFIG_LOCATION. Теперь после загрузки ваших свойств из комплекта вы читаете их также из этого внешнего файла «overrides.prop» - это переопределяет настройки по умолчанию из «Property.prop»:

PropertiesConfiguration pc1=new PropertiesConfiguration(a); 
    try(
FileReader propReader = new FileReader(System.getenv().get("CONFIG_FILES") +"/overrides.prop"){ pc1.load(propReader); 
} 

Когда вам нужно, чтобы сохранить изменения, вы сделаете это на «overrides.prop» - это сохранит все свойства, а не только измененные, но это не должно иметь негативных последствий.

+0

Спасибо, что нашли время ответить на мой вопрос. Прошло несколько дней, и я все еще обнимаю эту парадигму. Мне было трудно принять, что единственной формой сохранения файлов в Java EE является сохранение непосредственно в базе данных ... –

+0

@JoshuaTanton: Нигде не сказано, что единственная постоянная файла в Java EE находится в базе данных. Откуда у вас такое впечатление? – Kukeltje

+0

@ Kukeltje: Для моего ограниченного понимания JSF нет абсолютно никакого способа обновить значения конфигурационного файла .properties или .xml? Я даже пытался использовать конфигурацию apache commons, но даже несмотря на то, что значение, похоже, обновляется, значение в моем файле конфигурации по-прежнему остается неизменным, даже если я перезапущу сервер. Правильно ли я полагаю, что единственный способ сохранить данные динамической конфигурации - использовать базу данных? Заранее спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^