網頁

2020/6/25

Spring Boot MessageSource 簡單範例

Spring Boot MessageSource讀取properties檔訊息範例。


Spring Boot已經自動配置MessageSource,如無特別需求利用自動配置設定的即可。

範例環境:

  • Java 8
  • Spring Boot 2.2.1.RELEASE
  • Maven

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

@SpringBootApplication@Configuration類別配置MessageSource@Bean。本範例設定在@SpringBootApplication類別DemoApplication

DemoApplication

package com.abc.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.ResourceBundleMessageSource;

import java.nio.charset.StandardCharsets;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name()); // 解析properties檔的字符編碼
        messageSource.setBasename("messages"); // properties檔相對路徑名稱,不用包含.properties附檔名
        return messageSource;
    }

}

Spring對MessageSource的實做類別為ResourceBundleMessageSource,此類別利用jdk的ResourceBundle載入資源及MessageFormat產生格式化文字訊息。

建立ResourceBundleMessageSource的實例,
setDefaultEncoding設定解析properties檔的字符編碼為UTF-8(預設為ISO-8859-1);
setBasename()設定讀取檔案名稱為messages,所以會讀取相對路徑下的messages.properties


src/main/resources下新增messages.properties,即為上面MessageSource讀取的resource。

messages.properties

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

demo.simple.args對應值中的{0}{1}MessageFormat的format,可在程式中帶入變數。


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

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 message with args, arg_0=hello, arg_1=world
    }
}


範例目錄結構:

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

github

以上即為Spring MessageSource的基本範例,此功能用在多國語言(i18n)的實作


沒有留言:

張貼留言