Spring Boot MessageSource讀取properties檔訊息範例。
Spring Boot已經自動配置了MessageSource
,如無特別需求利用自動配置設定的即可。
範例環境:
- Java 8
- Spring Boot 2.2.1.RELEASE
- Maven
建立Spring Boot專案(參考IntelliJ IDEA,Eclipse 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
以上即為Spring MessageSource的基本範例,此功能用在多國語言(i18n)的實作。
沒有留言:
張貼留言