| 方法 | 特點 |
getMessage(code, args, defaultMsg, locale) | 找不到時返回 defaultMsg,不拋異常 |
getMessage(code, args, locale) | 找不到拋 NoSuchMessageException |
getMessage(resolvable, locale) | 參數封裝為 MessageSourceResolvable,較少用 |
args 為 Object[],對應資源文件中 {0}、{1} 佔位符。
Spring 自動裝配機制
ApplicationContext 啟動時自動查找 id 為 messageSource 的 Bean。標準實現:ResourceBundleMessageSource (基於 JDK ResourceBundle) 或 ReloadableResourceBundleMessageSource (支持熱加載)。
實戰配置步驟
1. 定義資源文件 (類路徑下)
# messages.properties (默認/回退)
greeting=Hello, {0}!
# messages_zh_CN.properties (中文簡體)
greeting=你好,{0}!
# messages_en_US.properties (英文)
greeting=Hello, {0}!
2. Spring XML 配置 MessageSource
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list><value>messages</value></list> <!-- 基礎名,自動追加 _Locale -->
</property>
<property name="defaultEncoding" value="UTF-8"/>
<property name="fallbackToSystemLocale" value="false"/> <!-- 不回退系統 Locale,改用默認文件 -->
</bean>
<!-- 可選:LocaleResolver 解析請求語言 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="zh_CN"/>
</bean>
<!-- 可選:LocaleChangeInterceptor 通過參數切換語言 -->
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"/> <!-- ?lang=en_US -->
</bean>
</mvc:interceptors>
3. 代碼中獲取國際化消息
@Controller
public class DemoController {
@Autowired private MessageSource messageSource;
@RequestMapping("/greet")
@ResponseBody
public String greet(@RequestParam String name, Locale locale) {
// 方式一:注入 MessageSource
return messageSource.getMessage("greeting", new Object[]{name}, locale);
// 方式二:繼承 WebApplicationObjectSupport 獲取
// return getMessageSourceAccessor().getMessage("greeting", name, locale);
}
}
4. JSP/Thymeleaf 視圖中使用
<!-- JSP Spring 標籤庫 -->
<%@ taglib prefix="spring" uri="https://www.springframework.org/tags" %>
<spring:message code="greeting" arguments="${userName}" />
<!-- Thymeleaf -->
<p th:text="#{greeting(${userName})}"></p>
進階特性
- 參數化:
user.welcome=Welcome {0}, your balance is {1} → getMessage("user.welcome", new Object[]{name, money}, locale)。
- 巢狀消息:資源文件值可引用其他 key (需自定義解析)。
- 熱加載:用
ReloadableResourceBundleMessageSource 設 cacheSeconds 實現修改即時生效。
- 編碼統一:強制
UTF-8 避免中文亂碼。
常見坑點避雷
- 文件命名必須
基礎名_語言_國家.properties,如 messages_zh_CN.properties。
- 資源文件編碼必須 UTF-8,IDE 設置檢查。
fallbackToSystemLocale=false 避免生產環境系統語言干擾,改回退默認文件 messages.properties。
- 佔位符索引從 0 開始,參數順序對應。
- 上一篇文章: SpringMVC 學習筆記(七):攔截器機制原理與三種實現方式全解析
- 下一篇文章: Java 設計模式精講:靜態代理與動態代理原理、實現與優劣對比
Copyright ©
程式碼之家 All Rights Reserved