LocalResolver使用
在 Spring Boot 中,默认使用的 LocaleResolver
取决于你的配置和依赖。你可以通过查看项目中的配置类或自动装配来判断当前使用的是哪个实现。
✅ 一、Spring Boot 默认的 LocaleResolver
📌 默认行为(无自定义配置):
如果你没有显式配置 LocaleResolver
,Spring Boot 会默认使用:
AcceptHeaderLocaleResolver
它根据 HTTP 请求头中的 Accept-Language
来决定语言环境。
🔍 示例请求头:
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
Spring 会按照优先级选择 en-US
作为当前 Locale。
✅ 二、常见的 LocaleResolver 实现类
类名 | 描述 | 特点 |
---|---|---|
AcceptHeaderLocaleResolver | 基于 HTTP 请求头的 Accept-Language 字段 | 简单,适合前后端分离项目 |
CookieLocaleResolver | 从客户端 Cookie 中读取 locale 信息 | 支持记住用户偏好 |
SessionLocaleResolver | 从 HttpSession 中获取 locale | 用户会话级别控制 |
FixedLocaleResolver | 固定 locale,适用于测试或固定语言场景 | 不灵活 |
自定义 LocaleResolver | 根据业务需求自己实现 | 灵活,适应复杂逻辑 |
✅ 三、什么时候需要自定义 LocaleResolver?
你可以在以下情况下考虑自定义:
🎯 1. 从请求参数中获取 locale(如 URL 参数、请求体)
例如:
GET /api/data?lang=en_US
🎯 2. 从 Token 或 Header 中解析语言信息(如 JWT、Authorization Header)
Authorization: Bearer <token> X-Locale: zh_CN
🎯 3. 用户语言偏好存储在数据库中,需动态加载
比如用户表中有字段 preferred_locale
,每次登录后设置。
🎯 4. 多租户系统中不同租户使用不同语言
需要根据租户 ID 动态设置 locale。
✅ 四、如何注册自定义 LocaleResolver?
步骤如下:
1️⃣ 实现 LocaleResolver
接口:
public class CustomLocaleResolver implements LocaleResolver {@Overridepublic Locale resolveLocale(HttpServletRequest request) {String lang = request.getParameter("lang");if (lang == null || lang.isEmpty()) {return Locale.getDefault(); // fallback}return new Locale(lang);} @Overridepublic void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {// 可选:实现保存逻辑(如写入 cookie 或 session)} }
2️⃣ 注册为 Bean 并覆盖默认策略:
@Configuration public class WebConfig implements WebMvcConfigurer { @Beanpublic LocaleResolver localeResolver() {return new CustomLocaleResolver();} @Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LocaleChangeInterceptor());} }
✅ 五、验证当前使用的是哪个 LocaleResolver
你可以通过调试或打印日志确认当前使用的 LocaleResolver
:
@Autowired private LocaleResolver localeResolver; @GetMapping("/locale") public String getLocale(HttpServletRequest request) {Locale locale = localeResolver.resolveLocale(request);return "Current Resolver: " + localeResolver.getClass().getSimpleName()+ ", Locale: " + locale; }
✅ 总结对比表
场景 | 使用哪种 LocaleResolver |
---|---|
前后端分离项目,前端控制语言 | AcceptHeaderLocaleResolver |
需要记住用户语言偏好 | CookieLocaleResolver |
用户登录后语言绑定到会话 | SessionLocaleResolver |
固定语言用于测试 | FixedLocaleResolver |
从 token/header/param 获取 | ✅ 自定义 LocaleResolver |
多租户、数据库动态配置 | ✅ 自定义 LocaleResolver |
如果你能提供你的 application.yml
或相关配置代码片段,我可以帮你更具体分析你当前用的是哪个 LocaleResolver
。