diff --git "a/docs/framework/fit/java/user-guide-book/12. \351\231\204\345\212\240\345\212\237\350\203\275\347\273\204\344\273\266.md" "b/docs/framework/fit/java/user-guide-book/12. \351\231\204\345\212\240\345\212\237\350\203\275\347\273\204\344\273\266.md" index 27b0ccd07..ec9de2f77 100644 --- "a/docs/framework/fit/java/user-guide-book/12. \351\231\204\345\212\240\345\212\237\350\203\275\347\273\204\344\273\266.md" +++ "b/docs/framework/fit/java/user-guide-book/12. \351\231\204\345\212\240\345\212\237\350\203\275\347\273\204\344\273\266.md" @@ -43,6 +43,116 @@ String messageEn = bundle.getMessage(new Locale("en"), "HELLO", "world"); static StringResource combine(Iterable providers) {...} ``` +## 地区解析器 + +FIT 框架提供了 `LocaleResolver` 接口用于从 HTTP 请求中解析用户的地区设置,该接口定义了两个核心方法: + +``` java +public interface LocaleResolver { + /** + * 解析用户的地区设置。 + * + * @param request 表示待解析 HTTP 请求的 {@link HttpClassicServerRequest}。 + * @return 表示解析出来地区信息的 {@link Locale}。 + */ + Locale resolveLocale(HttpClassicServerRequest request); + + /** + * 设置地区到返回响应中。 + * + * @param response 表示待设置地区的 HTTP 响应的 {@link HttpClassicServerResponse}。 + * @param locale 表示待设置地区的 {@link Locale}。 + */ + void setLocale(HttpClassicServerResponse response, Locale locale); +} +``` + +其中,`resolveLocale()` 方法用于从请求中解析地区信息,`setLocale()` 方法用于在响应中设置地区信息。 + +FIT 提供了 `DefualtLocaleResolver` 实现类,该类支持从多个来源解析地区信息,按优先级顺序为: + +1. 请求参数:从 URL 参数中获取名为 `locale` 的参数值。 +2. Cookie:从名为 `locale` 的 Cookie 中获取地区信息。 +3. 请求头:从 `Accept-Language` 请求头中解析地区信息。 + +## 地区解析过滤器 + +`LocaleResolveFilter` 是一个 HTTP 过滤器,用于自动处理请求的地区解析和响应的地区设置。该过滤器会在请求处理过程中自动执行以下操作: + +- 使用配置的 `LocaleResolver` 解析请求中的地区信息。 +- 将解析得到的地区信息设置到 `LocaleContextHolder` 中。 +- 根据 `LocaleResolver` 的实现逻辑在响应中设置相应的地区状态。 +- 在请求处理完成后清理线程本地的地区信息。 + +使用示例如下: + +``` java +@Component +public class WebConfig { + @Bean + public LocaleResolveFilter localeResolveFilter() { + return new LocaleResolveFilter(new DefualtLocaleResolver()); + } +} +``` + +## 地区上下文管理 + +FIT 框架提供了 `LocaleContextHolder` 类用于在当前线程中管理地区信息,该类使用 ThreadLocal 机制确保多线程环境下的地区信息隔离。主要方法包括: + +``` java +public class LocaleContextHolder { + /** + * 设置当前线程的地区上下文。 + * + * @param locale 表示待存储在当前线程地区上下文的 {@link Locale}。 + */ + public static void setLocale(Locale locale) { + if (locale != null) { + LOCALE_CONTEXT_HOLDER.set(locale); + } + } + + /** + * 获取当前线程的地区。 + * + * @return 表示当前线程上下文存储地区信息的 {@link Locale}。 + */ + public static Locale getLocale() { + return LOCALE_CONTEXT_HOLDER.get(); + } + + /** + * 清除当前线程的地区上下文。 + */ + public static void clear() { + LOCALE_CONTEXT_HOLDER.remove(); + } +} +``` + +使用示例: + +``` java +public class testLocaleContextHolder { + public void test() { + try { + // 设置当前线程的地区为英文。 + LocaleContextHolder.setLocale(Locale.ENGLISH); + // 获取当前线程的地区。 + Locale currentLocale = LocaleContextHolder.getLocale(); + } finally { + // 请在使用完毕后尽快清理当前线程的地区信息。 + LocaleContextHolder.clear(); + } + } +} +``` + +## 校验消息国际化 + +FIT 框架的校验功能支持国际化,实现通过 `LocaleContextMessageInterpolator` 类实现校验消息的多语言支持。该类会根据 `LocaleContextHolder` 中设置的地区信息自动选择对应语言的校验消息模板。 + # 12.2 Event事件 ## 12.2.1 相关接口 @@ -254,7 +364,6 @@ FIT 框架提供了基于 Hibernate Validator 的数据校验功能,支持对 @Component @Validated public class UserController { - public void createUser(@NotBlank(message = "用户名不能为空") String username, @Min(value = 18, message = "年龄必须大于等于 18") Integer age) { // 业务逻辑