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)
- 1.8
-
wicket
- 7.3.0
<dependency> <groupId>org.apache.wicket</groupId> <artifactId>wicket-core</artifactId> <version>7.3.0</version> </dependency>
- 7.3.0
参考サイト
プロパティファイルの配置先と読み込みの優先順位
ドキュメントを読む限り、
ストラテジーパターンを使ったリソースファイルの読み込み処理が幾つか用意されているとのことで、
以下、項番の優先順位でロジックが適用されていくようです。
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
Application
のInitializer
に登録したクラスの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
の使用を検討しようかと思います。
以上です。
コメント