strutsにてwebアプリケーションを開発する際は一般的に以下下記のようなコーディングをして propertiesファイルを読み込みます。
ResourceBundle resource = ResourceBundle.getBundle("hogehoge");
今回行いたいことは、webアプリケーションを再起動する事なくpropertiesファイルを読込たい為、以下のようなロジックを組みました。
ResourceBundle resource = ResourceBundle.getBundle("hogehoge", new NonCacheResourceBundleControl());
:
:
private static class NonCacheResourceBundleControl extends ResourceBundle.Control
{
@Override
public long getTimeToLive(String baseName, Locale locale) {
// キャッシュは無効.
return TTL_DONT_CACHE;
}
}
ただのjavaアプリケーションの場合は上記のようなコーディングにてキャッシュを無効にして該当のhogehoge.propertiesを読み込む事ができるのですが、strutsにて呼び出されたjavaアプリケーションの場合、読み込む事が出来ません。なので以下のような引数にClassLoaderを指定する事としました。これによりhogehoge.propertiesをキャッシュ無効にて読み込む事ができるようになります。
// 以下のようにクラスローダーを引数に含めないとpropertiesファイルを取得する事が出来ない。java言語側のバグと考えられる。
// クラスローダーの指定方法は、
// http://java.sun.com/javase/ja/6/docs/ja/api/
// の
// public static final ResourceBundle getBundle(String baseName)
// メソッドの説明と同様の指定内容としています。
// ちなみに 「呼び出し側のクラスローダーを使用して、リソースバンドルを取得」という事を指定しています。
ResourceBundle resource = ResourceBundle.getBundle("hogehoge", Locale.JAPAN, this.getClass().getClassLoader(), new NonCacheResourceBundleControl());
:
:
private static class NonCacheResourceBundleControl extends ResourceBundle.Control
{
@Override
public long getTimeToLive(String baseName, Locale locale) {
// キャッシュは無効.
return TTL_DONT_CACHE;
}
}