Spring徹底入門の備忘録です。
MessageSourceインターフェイスと実装クラス
Springでメッセージを外部定義から取得するための仕組みがあります。
"仕組みの中核を担う" --> 「MessageSourceインターフェイス」
MessageSourceはメッセージの格納先を抽象化するためのインターフェイスで、
メッセージを取得するためのメッソド(getMessage())を提供します。
MessageSourceの利用
ResourceBundleMessageSourceを利用して、プロパティファイルに定義したメッセージを取得する方法。
ReloadableResourceBundleMessageSourceも同じ要領で利用可能。
MessageSourceをDIコンテナに登録。
BeanのIDが"messageSource"になるように定義することで、DIコンテナ(ApplicationContext)内で使用するMessageSourceとして自動検出される。
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
// Set a property file on the class path.
messageSource.setBasename("messages");
// Set UTF-8 as a default encoding code
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
メッセージの定義
# welcome.message=ようこそ、{0}さん!
# welcome.message=ようこそ!
プロパティキーに「メッセージコード」、プロパティ値に「メッセージフォーマット」を指定します。
MessageSourceのAPI利用
DIコンテナに登録したMessageSourceをインジェクションして、getMessage()メソッドを呼び出します。
@Autowired
MessageSource messageSource;
public void showMessage() {
String message = messageSource.getMessage("welcome.message", new String[]{"〇〇"}, Locale.JAPANESE);
System.out.println(message);
}
showMessage()を呼び出す、コンソールに「ようこそ、〇〇さん!」と出力される。
MessageSourceResolvableの利用
「メッセージに埋め込む値」をプロパティファイルから取得する場合は
org.springframework.context.support.DefaultMessageSourceResolvableを使用する
MessageSourceResolvable functionName = new DefaultMessageSourceResolvable("functionName.userRegistration");
String message = messageSource.getMessage("welcome.message", new MessageSourceResolvable[]{functionName}, Locale.JAPANESE);
プログラム上でハードコーディングしていた値("〇〇")は、プロパティファイルも定義します。
# functionName.userRegistration=〇〇
ロケール別のメッセージ出力
クライアントに指定したロケールに対応したメッセージを出力するには、sppring:message要素を使用します。
メッセージはSpringが提供しているMessageSourceから取得する仕組みになっています。
メッセージの定義例(メッセージ定義用のプロパティファイル)
title.home=ホーム画面
JSPの実装例
<spring:message code="title.home"/>
HTMLの出力例
ホーム画面
sppring:message要素の主な属性
属性名 | 説明 |
---|---|
code | メッセージを取得するめのコード(プロパティキー)を指定する |
arguments | メッセージのプレースホルダ({インデックス番号}形式)に埋め込む値を指定する。かんま区切りの文字列またはオブジェクトのコレクション(配列)の指定が可能 |
text | デフォルトメッセージを指定する。この属性を指定したメッセージは、code属性に指定したコードに対応したメッセージが見つからない場合に使用される。複数の言語サポートする際に、修験後をtext属性に指定するといった利用方法が考えられる。 |