Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 110 additions & 1 deletion docs/framework/fit/java/user-guide-book/12. 附加功能组件.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,116 @@ String messageEn = bundle.getMessage(new Locale("en"), "HELLO", "world");
static StringResource combine(Iterable<StringResource> 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 相关接口
Expand Down Expand Up @@ -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) {
// 业务逻辑
Expand Down