2011年12月14日水曜日

ResourceBundleを利用して且つキャッシュを無効にしてpropertiesファイルを読む為の方法

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; 
        } 
    } 

0 件のコメント:

コメントを投稿