Skip to content

Commit f849028

Browse files
committed
修复逻辑错误,完善格式
1 parent 0493ec8 commit f849028

File tree

8 files changed

+81
-48
lines changed

8 files changed

+81
-48
lines changed

framework/fit/java/fit-builtin/plugins/fit-validation-hibernate-jakarta/src/test/java/modelengine/fitframework/validation/LocaleValidationControllerTest.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,4 @@ void shouldUseLocaleFromUrlParam() {
145145
assertThat(this.response.cookies().get("locale").get().value()).isEqualTo("en-US");
146146
assertThat(this.response.statusCode()).isEqualTo(500);
147147
}
148-
}
149-
150-
151-
152-
153-
154-
155-
148+
}
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,30 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
3+
* This file is a part of the ModelEngine Project.
4+
* Licensed under the MIT License. See License.txt in the project root for license information.
5+
*--------------------------------------------------------------------------------------------*/
6+
17
package modelengine.fitframework.validation.data;
28

39
import modelengine.fit.http.util.i18n.LocaleResolveFilter;
410
import modelengine.fitframework.annotation.Bean;
511
import modelengine.fitframework.annotation.Component;
612

13+
/**
14+
* 表示地区解析过滤器的配置类。
15+
*
16+
* @author 阮睿
17+
* @since 2025-09-11
18+
*/
719
@Component
820
public class LocaleResolveFilterConfig {
21+
/**
22+
* 创建地区解析过滤器 bean 对象。
23+
*
24+
* @return 表示作为 bean 的地区解析过滤器对象的 {@link LocaleResolveFilter}。
25+
*/
926
@Bean
1027
public LocaleResolveFilter localeResolveFilter() {
1128
return new LocaleResolveFilter();
1229
}
13-
}
30+
}

framework/fit/java/fit-builtin/plugins/fit-validation-hibernate-javax/src/test/java/modelengine/fitframework/validation/LocaleValidationControllerTest.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,4 @@ void shouldUseLocaleFromUrlParam() {
145145
assertThat(this.response.cookies().get("locale").get().value()).isEqualTo("en-US");
146146
assertThat(this.response.statusCode()).isEqualTo(500);
147147
}
148-
}
149-
150-
151-
152-
153-
154-
155-
148+
}
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,30 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
3+
* This file is a part of the ModelEngine Project.
4+
* Licensed under the MIT License. See License.txt in the project root for license information.
5+
*--------------------------------------------------------------------------------------------*/
6+
17
package modelengine.fitframework.validation.data;
28

39
import modelengine.fit.http.util.i18n.LocaleResolveFilter;
410
import modelengine.fitframework.annotation.Bean;
511
import modelengine.fitframework.annotation.Component;
612

13+
/**
14+
* 表示地区解析过滤器的配置类。
15+
*
16+
* @author 阮睿
17+
* @since 2025-09-11
18+
*/
719
@Component
820
public class LocaleResolveFilterConfig {
21+
/**
22+
* 创建地区解析过滤器 bean 对象。
23+
*
24+
* @return 表示作为 bean 的地区解析过滤器对象的 {@link LocaleResolveFilter}。
25+
*/
926
@Bean
1027
public LocaleResolveFilter localeResolveFilter() {
1128
return new LocaleResolveFilter();
1229
}
13-
}
30+
}

framework/fit/java/fit-builtin/services/fit-http-classic/definition/src/main/java/modelengine/fit/http/util/i18n/DefualtLocaleResolver.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
import modelengine.fit.http.Cookie;
1010
import modelengine.fit.http.server.HttpClassicServerRequest;
1111
import modelengine.fit.http.server.HttpClassicServerResponse;
12+
import modelengine.fitframework.util.StringUtils;
1213

14+
import java.util.List;
1315
import java.util.Locale;
1416

1517
/**
@@ -29,16 +31,20 @@ public class DefualtLocaleResolver implements LocaleResolver {
2931
public Locale resolveLocale(HttpClassicServerRequest request) {
3032
// 先解析 Cookie,如果没有则解析 Accept-Language 头。
3133
String newLocale = request.cookies().get(this.cookieName).map(Cookie::value).orElse(null);
32-
if (newLocale != null) {
34+
if (newLocale != null && StringUtils.isNotBlank(newLocale.trim())) {
3335
return Locale.forLanguageTag(newLocale);
3436
}
35-
String acceptLanguage;
36-
try {
37-
acceptLanguage = request.headers().require("Accept-Language");
38-
} catch (Exception e) {
39-
acceptLanguage = null;
37+
String acceptLanguage = null;
38+
List<String> acceptLanguages = request.headers().all("Accept-Language");
39+
40+
for (String language : acceptLanguages) {
41+
if (language != null && StringUtils.isNotBlank(language.trim())) {
42+
acceptLanguage = language;
43+
break;
44+
}
4045
}
41-
if (acceptLanguage != null && !acceptLanguage.trim().isEmpty()) {
46+
47+
if (acceptLanguage != null && StringUtils.isNotBlank(acceptLanguage.trim())) {
4248
return Locale.forLanguageTag(acceptLanguage);
4349
}
4450

@@ -64,7 +70,7 @@ public void setLocale(HttpClassicServerResponse response, Locale locale) {
6470
/**
6571
* 设置存储地区信息的 Cookie 名称。
6672
*
67-
* @param cookieName 表示将要设置 Cookie 名称的 {@link String}。
73+
* @param cookieName 表示待设置 Cookie 名称的 {@link String}。
6874
*/
6975
public void setCookieName(String cookieName) {
7076
this.cookieName = cookieName;
@@ -73,7 +79,7 @@ public void setCookieName(String cookieName) {
7379
/**
7480
* 设置存储地区信息的 Cookie 的最大有效期。
7581
*
76-
* @param cookieMaxAge 表示将要设置的 Cookie 最大有效期的 {@code int}。
82+
* @param cookieMaxAge 表示待设置的 Cookie 最大有效期的 {@code int}。
7783
*/
7884
public void setCookieMaxAge(int cookieMaxAge) {
7985
this.cookieMaxAge = cookieMaxAge;
@@ -105,4 +111,4 @@ public void setCookiePath(String cookiePath) {
105111
public void setDefaultLocale(Locale defaultLocale) {
106112
this.defaultLocale = defaultLocale;
107113
}
108-
}
114+
}

framework/fit/java/fit-builtin/services/fit-http-classic/definition/src/main/java/modelengine/fit/http/util/i18n/LocaleResolveFilter.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import modelengine.fit.http.server.*;
1010
import modelengine.fitframework.annotation.Scope;
11+
import modelengine.fitframework.util.StringUtils;
1112
import modelengine.fitframework.util.i18n.LocaleContextHolder;
1213

1314
import java.util.List;
@@ -21,11 +22,8 @@
2122
*/
2223
public class LocaleResolveFilter implements HttpServerFilter {
2324
private LocaleResolver localeResolver = null;
24-
2525
private List<String> matchPatterns = List.of("/**");
26-
2726
private List<String> mismatchPatterns = List.of();
28-
2927
private Scope scope = Scope.PLUGIN;
3028

3129
/**
@@ -68,11 +66,16 @@ public List<String> mismatchPatterns() {
6866
public void doFilter(HttpClassicServerRequest request, HttpClassicServerResponse response,
6967
HttpServerFilterChain chain) throws DoHttpServerFilterException {
7068
try {
71-
// 如果参数中带有地区,说明用户想使用新地区执行后续的操作,直接设置地区。
72-
String paramLocale = request.queries().first("locale").orElse(null);
69+
List<String> paramLocales = request.queries().all("locale");
7370
Locale responseLocale = null;
74-
if (paramLocale != null && !paramLocale.trim().isEmpty()) {
75-
responseLocale = Locale.forLanguageTag(paramLocale);
71+
for (String paramLocale : paramLocales) {
72+
if (paramLocale != null && StringUtils.isNotBlank(paramLocale.trim())) {
73+
responseLocale = Locale.forLanguageTag(paramLocale);
74+
break;
75+
}
76+
}
77+
// 如果参数中带有地区,说明用户想使用新地区执行后续的操作,直接设置地区。
78+
if (responseLocale != null) {
7679
LocaleContextHolder.setLocale(responseLocale);
7780
}
7881
// 如果参数中不包含地区,则解析请求所带的地区参数。
@@ -84,16 +87,17 @@ public void doFilter(HttpClassicServerRequest request, HttpClassicServerResponse
8487
// 继续执行后续过滤器。
8588
chain.doFilter(request, response);
8689

87-
// responseLocale 是用户期望设置的地区,不受 server 端处理的影响。
88-
this.localeResolver.setLocale(response, responseLocale);
90+
if (!response.isCommitted()) {
91+
// responseLocale 是用户期望设置的地区,不受 server 端处理的影响。
92+
this.localeResolver.setLocale(response, responseLocale);
93+
}
8994
} finally {
9095
LocaleContextHolder.clear();
9196
}
92-
9397
}
9498

9599
@Override
96100
public Scope scope() {
97101
return this.scope;
98102
}
99-
}
103+
}

framework/fit/java/fit-builtin/services/fit-http-classic/definition/src/main/java/modelengine/fit/http/util/i18n/LocaleResolver.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,22 @@
1919
*/
2020
public interface LocaleResolver {
2121
/**
22-
* 表示要设置 cookie 的名称。
22+
* 表示待设置 cookie 的名称。
2323
*/
2424
public static final String DEFAULT_COOKIE_NAME = "locale";
25+
2526
/**
26-
* 表示要设置 cookie 的自动过期时间。
27+
* 表示待设置 cookie 的自动过期时间。
2728
*/
2829
public static final int DEFAULT_COOKIE_MAX_AGE = 60 * 60 * 24 * 365;
30+
2931
/**
30-
* 表示要设置 Cookie 的可见域。
32+
* 表示待设置 Cookie 的可见域。
3133
*/
3234
public static final String DEFAULT_COOKIE_DOMAIN = "/";
35+
3336
/**
34-
* 表示要设置 Cookie 的可见 URL 路径。
37+
* 表示待设置 Cookie 的可见 URL 路径。
3538
*/
3639
public static final String DEFAULT_COOKIE_PATH = "/";
3740

@@ -46,8 +49,8 @@ public interface LocaleResolver {
4649
/**
4750
* 设置地区到返回响应中。
4851
*
49-
* @param response 表示将要设置地区 HTTP 响应的 {@link HttpClassicServerResponse}。
50-
* @param locale 表示要设置地区的 {@link Locale}。
52+
* @param response 表示待设置地区的 HTTP 响应的 {@link HttpClassicServerResponse}。
53+
* @param locale 表示待设置地区的 {@link Locale}。
5154
*/
5255
void setLocale(HttpClassicServerResponse response, Locale locale);
53-
}
56+
}

framework/fit/java/fit-util/src/main/java/modelengine/fitframework/util/i18n/LocaleContextHolder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class LocaleContextHolder {
2020
/**
2121
* 设置当前线程的地区上下文。
2222
*
23-
* @param locale 表示将要存储在当前线程地区上下文的 {@link Locale}。
23+
* @param locale 表示待存储在当前线程地区上下文的 {@link Locale}。
2424
*/
2525
public static void setLocale(Locale locale) {
2626
if (locale != null) {
@@ -43,4 +43,4 @@ public static Locale getLocale() {
4343
public static void clear() {
4444
LOCALE_CONTEXT_HOLDER.remove();
4545
}
46-
}
46+
}

0 commit comments

Comments
 (0)