From 2ba2bcbb94b526631eea4472f28da81977c3f573 Mon Sep 17 00:00:00 2001 From: RR <331382125@qq.com> Date: Mon, 15 Sep 2025 14:43:10 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=8F=90=E4=BE=9B=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96=E5=8A=9F=E8=83=BD=E7=9A=84=E6=96=87=E6=A1=A3=E8=A1=A5?= =?UTF-8?q?=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...37\350\203\275\347\273\204\344\273\266.md" | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) 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..d7917b728 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,78 @@ String messageEn = bundle.getMessage(new Locale("en"), "HELLO", "world"); static StringResource combine(Iterable providers) {...} ``` +## 地区解析器 + +FIT 框架提供了 `LocaleResolver` 接口用于从 HTTP 请求中解析用户的地区设置,该接口定义了两个核心方法: + +``` java +public interface LocaleResolver { + Locale resolveLocale(HttpClassicServerRequest request); + 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 +// 设置当前线程的地区 +LocaleContextHolder.setLocale(Locale locale); + +// 获取当前线程的地区 +Locale getLocale(); + +// 清理当前线程的地区信息 +void clear(); +``` + +使用示例: + +``` java +// 设置当前线程的地区为英文 +LocaleContextHolder.setLocale(Locale.ENGLISH); + +// 获取当前线程的地区 +Locale currentLocale = LocaleContextHolder.getLocale(); + +// 清理当前线程的地区信息 +LocaleContextHolder.clear(); +``` + +## 校验消息国际化 + +FIT 框架的校验功能支持国际化,实现通过 `LocaleContextMessageInterpolator` 类实现校验消息的多语言支持。该类会根据 `LocaleContextHolder` 中设置的地区信息自动选择对应语言的校验消息模板。 + # 12.2 Event事件 ## 12.2.1 相关接口 From f83b33bb43cac7a46dc8850da5d08f08cea3cc3b Mon Sep 17 00:00:00 2001 From: RR <331382125@qq.com> Date: Mon, 15 Sep 2025 22:35:32 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...37\350\203\275\347\273\204\344\273\266.md" | 61 ++++++++++++++----- 1 file changed, 45 insertions(+), 16 deletions(-) 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 d7917b728..c1d4f86d3 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" @@ -49,7 +49,14 @@ FIT 框架提供了 `LocaleResolver` 接口用于从 HTTP 请求中解析用户 ``` java public interface LocaleResolver { + /** + * 解析用户的地区设置。 + */ Locale resolveLocale(HttpClassicServerRequest request); + + /** + * 设置地区到返回响应中。 + */ void setLocale(HttpClassicServerResponse response, Locale locale); } ``` @@ -59,7 +66,7 @@ public interface LocaleResolver { FIT 提供了 `DefualtLocaleResolver` 实现类,该类支持从多个来源解析地区信息,按优先级顺序为: 1. 请求参数:从 URL 参数中获取名为 `locale` 的参数值。 -2. Cookie:从名为 `locale` 的 Cookie 中获取地区信息 。 +2. Cookie:从名为 `locale` 的 Cookie 中获取地区信息。 3. 请求头:从 `Accept-Language` 请求头中解析地区信息。 ## 地区解析过滤器 @@ -88,27 +95,50 @@ public class WebConfig { FIT 框架提供了 `LocaleContextHolder` 类用于在当前线程中管理地区信息,该类使用 ThreadLocal 机制确保多线程环境下的地区信息隔离。主要方法包括: ``` java -// 设置当前线程的地区 -LocaleContextHolder.setLocale(Locale locale); +public class LocaleContextHolder { + private static final ThreadLocal LOCALE_CONTEXT_HOLDER = new ThreadLocal<>(); + + /** + * 设置当前线程的地区上下文。 + */ + public static void setLocale(Locale locale) { + if (locale != null) { + LOCALE_CONTEXT_HOLDER.set(locale); + } + } -// 获取当前线程的地区 -Locale getLocale(); + /** + * 获取当前线程的地区。 + */ + public static Locale getLocale() { + return LOCALE_CONTEXT_HOLDER.get(); + } -// 清理当前线程的地区信息 -void clear(); + /** + * 清除当前线程的地区上下文。 + */ + public static void clear() { + LOCALE_CONTEXT_HOLDER.remove(); + } +} ``` 使用示例: ``` java -// 设置当前线程的地区为英文 -LocaleContextHolder.setLocale(Locale.ENGLISH); - -// 获取当前线程的地区 -Locale currentLocale = LocaleContextHolder.getLocale(); - -// 清理当前线程的地区信息 -LocaleContextHolder.clear(); +public class testLocaleContextHolder { + public void test(){ + try{ + // 设置当前线程的地区为英文。 + LocaleContextHolder.setLocale(Locale.ENGLISH); + + // 获取当前线程的地区。 + Locale currentLocale = LocaleContextHolder.getLocale(); + }finally{ + // 请在使用完毕后尽快清理当前线程的地区信息。 + LocaleContextHolder.clear(); + } + } ``` ## 校验消息国际化 @@ -326,7 +356,6 @@ FIT 框架提供了基于 Hibernate Validator 的数据校验功能,支持对 @Component @Validated public class UserController { - public void createUser(@NotBlank(message = "用户名不能为空") String username, @Min(value = 18, message = "年龄必须大于等于 18") Integer age) { // 业务逻辑 From c0de3844266525924b971baece311372735f773a Mon Sep 17 00:00:00 2001 From: RR <331382125@qq.com> Date: Tue, 16 Sep 2025 10:08:17 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\212\237\350\203\275\347\273\204\344\273\266.md" | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) 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 c1d4f86d3..de9eca48c 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" @@ -51,11 +51,17 @@ FIT 框架提供了 `LocaleResolver` 接口用于从 HTTP 请求中解析用户 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); } @@ -96,10 +102,10 @@ FIT 框架提供了 `LocaleContextHolder` 类用于在当前线程中管理地 ``` java public class LocaleContextHolder { - private static final ThreadLocal LOCALE_CONTEXT_HOLDER = new ThreadLocal<>(); - /** * 设置当前线程的地区上下文。 + * + * @param locale 表示待存储在当前线程地区上下文的 {@link Locale}。 */ public static void setLocale(Locale locale) { if (locale != null) { @@ -109,6 +115,8 @@ public class LocaleContextHolder { /** * 获取当前线程的地区。 + * + * @return 表示当前线程上下文存储地区信息的 {@link Locale}。 */ public static Locale getLocale() { return LOCALE_CONTEXT_HOLDER.get(); @@ -139,6 +147,7 @@ public class testLocaleContextHolder { LocaleContextHolder.clear(); } } +} ``` ## 校验消息国际化 From 87845f4c2365dccdfcd5686e6dbf157441bd55c1 Mon Sep 17 00:00:00 2001 From: RR <331382125@qq.com> Date: Tue, 16 Sep 2025 10:36:48 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...240\345\212\237\350\203\275\347\273\204\344\273\266.md" | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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 de9eca48c..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" @@ -135,14 +135,13 @@ public class LocaleContextHolder { ``` java public class testLocaleContextHolder { - public void test(){ - try{ + public void test() { + try { // 设置当前线程的地区为英文。 LocaleContextHolder.setLocale(Locale.ENGLISH); - // 获取当前线程的地区。 Locale currentLocale = LocaleContextHolder.getLocale(); - }finally{ + } finally { // 请在使用完毕后尽快清理当前线程的地区信息。 LocaleContextHolder.clear(); }