網頁

2020/6/28

Spring Boot MessageSource 自動配置

Spring Boot自動配置了MessageSource做i18n多國語言訊息,所以若無特殊需求不用自己配置MessageSource的bean。

自動配置類別為MessageSourceAutoConfiguration

範例環境:

  • Java 8
  • Spring Boot 2.2.1.RELEASE
  • Maven

建立Spring Boot專案(參考IntelliJ IDEAEclipse STS)

Spring Boot預設會尋找classpath根目錄下名稱為messages的properties作為訊息來源。如果想要使用其他名稱或路徑,可在Spring Boot配置檔application.properties設定spring.messages.basename修改,不過一旦自訂了訊息檔名稱,則預設就不再讀取messages

例如下面設定訊息檔為classpath根目錄(src.main.resources)的messages.propertiesi18n/simple.properties

application.properties

#context path
server.servlet.context-path=/demo
#port
server.port=8080

#MessageSourceProperties
spring.messages.basename=messages,i18n.simple

其他spring.messages配置屬性請參考MessageSourceProperties


messages.propertiesi18n/simple.properties內容如下。

src/main/resources/messages.properites

demo.message=MessageSource auto config
demo.message.args=A message with args, arg_0={0}, arg_1={1}

src/main/resources/i18n/simple.properites

demo.simple=A simple message
demo.simple.args=A simple message with args, arg_0={0}, arg_1={1}

訊息來源檔中的{0}{1}MessageFormat的format,可在程式中帶入變數。

新增DemoController使用MessageSource如下。

DemoController

package com.abc.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Locale;

@RestController
public class DemoController {

    @Autowired
    private MessageSource messageSource;

    @GetMapping("/message")
    public void message() {
        String s1 = messageSource.getMessage("demo.simple", null, Locale.ENGLISH);
        System.out.println(s1); // A simple message

        String s2 = messageSource.getMessage("demo.simple.args", new String[]{"hello", "world"}, Locale.ENGLISH);
        System.out.println(s2); // A simple message with args, arg_0=hello, arg_1=world

        String s3 = messageSource.getMessage("demo.message", null, Locale.ENGLISH);
        System.out.println(s3); // MessageSource auto config

        String s4 = messageSource.getMessage("demo.message.args", new String[]{"foo", "bar"}, Locale.ENGLISH);
        System.out.println(s4); // A message with args, arg_0=foo, arg_1=bar

    }
}

呼叫MessageSource.getMessage()取得messages.propertiessimple.properties中的文字。
第一個參數為properties訊息的key,
第二個參數為format可帶入的變數,
第三個參數為Locale

目錄結構

src/main
├─java/com/abc/demo/
│ ├─DemoApplication.java
│ └─controller/
│   └─DemoController.java
└─resources
  ├─application.properties
  ├─messages.properties
  └─i18n/
    └─simple.properites

完整程式碼請參考github


沒有留言:

張貼留言