バックグラウンド:
ユーザーに表示されるメッセージは、言語と会社の部門の両方で異なる必要があるという要件があります。したがって、すぐに使用できるリソース バンドルを使用することはできないため、基本的には、PropertiesConfiguration ファイルを使用して独自のバージョンのリソース バンドルを作成しています。
さらに、再起動を行わずに、本番環境でメッセージを動的に変更できる必要があるという要件があります。
プロパティ ファイルの 3 つの異なる繰り返しを読み込んでいます。
-basename_division.properties
-basename_2CharLanguageCode.properties
-basename.properties
これらのファイルはクラスパスに存在します。このコードは、Portal 内の複数のポートレットで使用されるタグ ライブラリに入れられます。
可能な .properties ファイルを作成し、次の方法でそれぞれをロードしようとします。
PropertiesConfiguration configurationProperties;
try {
configurationProperties = new PropertiesConfiguration(propertyFileName);
configurationProperties.setReloadingStrategy(new FileChangedReloadingStrategy());
} catch (ConfigurationException e) {
/* This is ok -- it just means that the specific configuration file doesn't
exist right now, which will often be true. */
return(null);
}
ファイルが正常に見つかった場合は、作成された PropertiesConfiguration を再利用できるようにハッシュマップに保存し、キーを見つけようとします。(通常のリソース バンドルとは異なり、キーが見つからない場合は、より一般的なファイルを見つけて、そのファイルにキーが存在するかどうかを確認しようとします。そのため、オーバーライド例外のみを言語/部門固有のプロパティに入れる必要があります。ファイル。)
問題:
最初にチェックされたときにファイルが存在しなかった場合、予想される例外がスローされます。ただし、後でファイルがクラスパスにドロップされ、このコードが再実行された場合でも、例外はスローされます。ポータルを再起動すると明らかに問題は解消されますが、それは私にとっては役に立ちません。言語/会社部門のオーバーライドのために、再起動なしで新しいメッセージをドロップできるようにする必要があります。また、かなりの数の部門があるため、考えられるすべての部門に対して空のファイルを作成することにあまり興味がありません。
これは classLoader の問題であると想定しています。最初はファイルがクラスパスに存在しなかったと判断し、同じファイルをリロードしようとしたときにその結果がキャッシュされます。私はclassLoaderであまりにも派手なことをすることに興味はありません。(そのコードを理解/保守できるのは私だけです。) 特定の環境は WebSphere Portal です。
これを回避する方法はありますか?