Web系開発メモ

Java, C#, HTML, CSS, JavaScript のことなどを書いてます。

SpringBoot MessageSourceでメッセージを取得する方法

Spring の MessageSource を使って、メッセージをプロパティファイルから取得する方法を書いていきます。

バージョン

  • SpringBoot 2.7.5

目次

  1. プロパティファイルの作成
  2. Java コードの作成
  3. 動作確認
  4. 国際化・多言語対応
  5. 複数のプロパティファイルに対応

1. プロパティファイルの作成

プロジェクトのリソースフォルダに、messages.propertiesUTF-8 で作成します。

src/main/resources/messages.properties

hello=こんにちは、{0}さん。

{0}プレースホルダで、動的に設定する値を、数字の 0 から順番に指定できます。

2. Java コードの作成

メッセージを取得したいクラスに、MessageSource のフィールドを定義して、@Autowired で DI します。

@RestController
public class MsgController {

  @Autowired
  MessageSource messages;

  @GetMapping("/msg")
  public Map<String, String> msg(@RequestParam String name) {
    String msg = messages.getMessage(
      "hello", new String[]{name}, Locale.JAPAN
    );
    return Collections.singletonMap("msg", msg);
  }
}

それから、MessageSource#getMessage に以下の引数を渡して、メッセージを取得します。

  1. メッセージのキー
  2. 動的に設定する値
  3. ロケール

動的に設定する値がない場合は、第2引数に null を指定します。

3. 動作確認

アプリを起動して以下の URL にアクセスすると、

http://localhost:8080/msg?name=トム

下の JSON が返ってきます。

{"msg":"こんにちは、トムさん。"}

4. 国際化・多言語対応

複数の言語に対応したメッセージを取得する方法を書いていきます。

4.1. プロパティファイルの作成

言語に応じたプロパティファイルを作成します。

例えば、日本語用のファイルと、

src/main/resources/messages_ja.properties

hello=こんにちは、{0}さん。

英語用のファイルを用意します。

src/main/resources/messages_en.properties

hello=Hello, {0}.

ファイル名の _ja, _en で区別されます。

4.1. Java コードの作成

コントローラーの場合は、メソッドの引数に Locale を定義すると、Spring Boot が要求元のロケールを渡してくれます。

@RestController
public class MsgController {

  @Autowired
  MessageSource messages;

  @GetMapping("/msg")
  public Map<String, String> msg(
    @RequestParam String name, Locale locale
  ) {
    String msg = messages.getMessage(
      "hello", new String[]{name}, locale
    );
    return Collections.singletonMap("msg", msg);
  }
}

これで、クライアントの言語(ブラウザ設定の言語)に対応するメッセージが取得できます。

5. 複数のプロパティファイルに対応

複数のプロパティファイルからメッセージを取得したい場合は、以下の設定ファイルで指定します。

src/main/resources/application.properties

spring.messages.basename=messages1, messages2

カンマ区切りで、ファイルのベース名を設定します。