Wicket application で 共通のプロパティファイルを使用する


Wicket で 文字列を取得する際、
Page#getString(String key) で取得できますが、
Page間共通で使用するプロパティを使用する方法がないか調べてみました。


環境情報

  • java

    • 1.8
      java version "1.8.0_45"
      Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
      Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
      
  • wicket

    • 7.3.0
          <dependency>
              <groupId>org.apache.wicket</groupId>
              <artifactId>wicket-core</artifactId>
              <version>7.3.0</version>
          </dependency>
      

参考サイト


プロパティファイルの配置先と読み込みの優先順位

ドキュメントを読む限り、
ストラテジーパターンを使ったリソースファイルの読み込み処理が幾つか用意されているとのことで、
以下、項番の優先順位でロジックが適用されていくようです。


1. ComponentStringResourceLoader

FooPage.properties, FooPanel.properties のようにコンポーネントクラス単位に配置された
プロパティファイルを読み込む


2. PackageStringResourceLoader

パッケージ単位に配置された wicket-package.properties を読み込む このwicket-package.propertiesは wicket1.5からwicket6.0へのマイグレーション項目になっています。
Migration to Wicket 6.0 - Apache Wicket - Apache Software Foundation 確かにpackage.properties では被る可能性は0ではないかもしれません。


3. ClassStringResourceLoader

サーチ対象に設定したクラスのプロパティファイルを読み込む。
デフォルトのサーチ対象は、Applicationクラス。
デフォルトということは、変更可能だということかと思いますが、まず変更はしなさそうです。
下記に記載の ResourceSettings.java のコンストラクタ内で確かにアプリケーションクラスを
デフォルトで設定しています。


4. ValidatorStringResourceLoader

Validatorクラスの FooValidator.propertiesを読み込む。
[4]番目なので、 相当優先順位が低いです。


5. InitializerStringResourceLoader

ApplicationInitializerに登録したクラスのFooInitializer.propertiesを読み込む。
そもそも中々登録し無さそうなので、あまり意識する必要はない。
逆に、このような動作になった時検知が難しそうに思いました。


以下、wicket/ResourceSettings.java at wicket-7.x · apache/wicket
ResourceSettings.java コンストラクター記述の抜粋です。
確かに、ユーザーガイド記載の順番で、addされています。

  • ResourceSettings.java
package org.apache.wicket.settings;
...

    public ResourceSettings(final Application application)
    {
        this.application = application;
        stringResourceLoaders.add(new ComponentStringResourceLoader());
        stringResourceLoaders.add(new PackageStringResourceLoader());
        stringResourceLoaders.add(new ClassStringResourceLoader(application.getClass()));
        stringResourceLoaders.add(new ValidatorStringResourceLoader());
        stringResourceLoaders.add(new InitializerStringResourceLoader(application.getInitializers()));
    }

Compornent#getString() でプロパティがなかった場合

java.util.MissingResourceException が Throw されます。

org.apache.wicket.DefaultExceptionMapper: Unexpected error occurred
! java.util.MissingResourceException: Unable to find property: 'snippet.title' for component: videos:0 [class=org.apache.wicket.markup.html.list.ListItem]. Locale: null, style: null
! at org.apache.wicket.Localizer.getString(Localizer.java:268)

確かにプログラム上、ないプロパティキー snippet.title を指定していました。
というか、ListItem に getString()が。。
どこで使うのだろう。

    @Override
    protected void populateItem(ListItem<Document> item) {
        Label title = new Label("title", item.getString("snippet.title"));
        item.add(title);
    }

個人的なプロパティファイルの管理戦略

  • アプリケーション共通で使用する設定値、文言の管理
    ClassStringResourceLoader を使用する。

  • 画面個別での、設定値、文言の管理
    ComponentStringResourceLoader を使用する。

が基本的な方針かと思いました。
場合によって、wicket-package.properties の使用を検討しようかと思います。

以上です。

コメント

カテゴリー