LoginSignup
19
17

More than 5 years have passed since last update.

【Spring】メッセージの外部化

Posted at

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

メッセージの定義

messages.properties
# welcome.message=ようこそ、{0}さん!
application-messages.properties
# 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);

プログラム上でハードコーディングしていた値("〇〇")は、プロパティファイルも定義します。

messages.properties
# functionName.userRegistration=〇〇

ロケール別のメッセージ出力

クライアントに指定したロケールに対応したメッセージを出力するには、sppring:message要素を使用します。
メッセージはSpringが提供しているMessageSourceから取得する仕組みになっています。

メッセージの定義例(メッセージ定義用のプロパティファイル)

title.home=ホーム画面

JSPの実装例

<spring:message code="title.home"/>

HTMLの出力例
text
ホーム画面

sppring:message要素の主な属性

属性名 説明
code メッセージを取得するめのコード(プロパティキー)を指定する
arguments メッセージのプレースホルダ({インデックス番号}形式)に埋め込む値を指定する。かんま区切りの文字列またはオブジェクトのコレクション(配列)の指定が可能
text デフォルトメッセージを指定する。この属性を指定したメッセージは、code属性に指定したコードに対応したメッセージが見つからない場合に使用される。複数の言語サポートする際に、修験後をtext属性に指定するといった利用方法が考えられる。
19
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
17