2016-12-01 11 views
0

EclipseのJSF Webアプリケーションプロジェクトで、すべてのサーバーとデータベースの接続を含むプロパティファイルを読み書きしようとしています。コンソールに書き込むためにlog4jを使用していますか?私のconfig.propertiesファイルは次のとおりです。Web Appプロジェクトでプロパティファイルが更新されないのはなぜですか?

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

私は(これは右のクラスパスですか?)/ WebアプリケーションにWEB-INF/classesフォルダを私のconfig.propertiesファイルを置きました。ファイルを削除するとファイルが破損するため、この特定の場所でファイルを正しく読み取っていることを確認しました。

私のマネージドBeanでは、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); 
      } 
     } 
    } 
} 

プロパティファイルからの読み込みに問題はありませんでしたが、ファイルに書き込むのに苦労しました。この問題は、私が「192.168.1.1」には「localhost」からサーバー名を変更した場合、私は新しい情報が、私はページを更新するかにもかかわらず持続することが確認でき、

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

を指定することで解決されているように見えましたサーバーを再始動してください。私はconfig.propertiesファイルを開いたとき、私は情報がどこかにファイルが残っていても存続しているようだ

dbserver=192.168.1.1 

を見て期待していたときに...しかし、私はまだ

dbserver=localhost 

を見ます同じ?私の所有物の内容にどのようにアクセスして変更を見ることができますか? WARファイルの変更

+0

JSFはこのようにプロパティファイルを(再)ロードすることについて何も知りません。だからあなたの質問はjsf関連ではありません。 _ "私は自分のconfig.propertiesファイルをwebapp/WEB-INF/classesフォルダに配置しました(これはクラスパスの権利ですか?)。 srcフォルダ(src/main/resources、Mavenを使用している場合など)にある可能性が最も高い場所 – Kukeltje

+0

ありがとうございました。まだあなたが言ったことを消化しようとしていますが、それは私の目を開けました。 –

答えて

0

(例えば、いくつかのウェブサーバは、ファイルの変更に気づくことがありANサーバは、展開などで戦争を爆発するときに問題がある可能性があり、アプリケーションを再デプロイ)

私は考え悪い考えです別のアプローチを適用する示唆 - いくつかの可能性があります:データベーステーブルのプロパティ

場所なので、彼らは簡単に

は、外部プロパティは、あなたの「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のコモンズの設定を使用してみましたが、値が更新されるように見えても、私の設定ファイルの値は、サーバを再起動しても同じままです。動的構成データを保存できる唯一の方法は、データベースを使用することだと考えていますか?少し早いですがお礼を! –

関連する問題