- 4.1. ApplicationContext
- 4.2. MessageSource
- 4.3. イベントの伝播
- 4.4. Web アプリケーションでの ApplicationContext の利用
4.2. MessageSource
冒頭で少し触れましたが ApplicationContext では国際化に対応したメッセージを使用することができます。メッセージを利用するにはまずコンテナにリソースバンドルの場所を知らせるための設定を Bean 定義ファイルに記述します。
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>com.techscore.spring.di.messages</value> <value>com.techscore.spring.di.errors</value> </list> </property> </bean>
bean 要素の id 属性には "messageSource" を指定します。ApplicationContext は起動時にこの名前で MessageSource が定義されているか検索を行うため他の名前を指定してはいけません。class 属性値とプロパティ名は例と同じになるようにしてください。value 要素の内容には ApplicationContext に読み込ませるリソースバンドルを指定します。Struts などと同様にファイル名は一般的なリソースバンドルと同じ形式に従わなければなりません。
(基底名)_(ロケール).properties
詳しくは Struts 4 章を参照してください。例では com.techscore.spring.di
パッケージにある messages, errors という基底名のリソースバンドルを指定しています。list 要素を使用しているのでいくつでもリソースバンドルを
ApplicationContext に読み込ませることができます。
メッセージの取得には org.springframework.context.MessageSource
インタフェースで定義されている以下のメソッドを使用します。
String getMessage(MessageSourceResolvable resolvable, Locale locale)
String getMessage(String code, Object[] args, Locale locale)
String getMessage(String code, Object[] args, String defaultMessage, Locale locale)
ここでは、2番目と 3番目のメソッドを使用して取得する方法を説明します。ApplicationContext は MessageSource インタフェースを拡張したものですので上記のメソッドを使用することができます。
# messages_ja_JP.properties greeting=こんにちは
# errors_ja_JP.properties errors.required={0} は必須です。
リソースバンドルにはそれぞれ上記のメッセージが登録されているとします。
public class Main { public static void main(String[] args) { ApplicationContext appContext = new ClassPathXmlApplicationContext("/com/techscore/spring/di/beans.xml"); String message = appContext.getMessage("greeting", null, Locale.getDefault()); String shout = appContext.getMessage("shout", null, "not found message key 'shout'", Locale.getDefault()); String error = appContext.getMessage("errors.required", new String[]{"hoge"}, Locale.getDefault()); System.out.println("message=[" + message + "]"); System.out.println("shout=[" + shout + "]"); System.out.println("error=[" + error + "]"); } }
これを実行すると以下の出力を得ます。
message=[こんにちは] shout=[not found message key 'shout'] error=[hoge は必須です。]
2つめの getMessage() メソッドではリソースバンドルに定義されていないメッセージキーを指定していますのでデフォルトのメッセージが表示されます。もしデフォルトのメッセージが指定されていなければ
org.springframework.context.NoSuchMessageException
がスローされます。用意していないロケールが渡される場合を想定するとデフォルトのリソースバンドルを用意するか、デフォルトのメッセージを設定するかしておいた方がよいでしょう。errors.required
はパラメータを受け取るため第 2 引数に String の配列を渡しています。
実習課題 1
Spring を使用して以下の要件を満たすコンソールアプリケーションを作成しなさい。
- MessageSource を使用して何らかのメッセージを表示する。
- 複数の言語のリソースバンドルを用意し、ロケールにより出力されるメッセージが切り替わるようにすること。