refactor: 优化上下文传递

This commit is contained in:
zhouhao
2025-08-04 14:06:53 +08:00
parent 2dbb9c7cc0
commit 3f7e040c44
6 changed files with 71 additions and 2 deletions

View File

@@ -10,7 +10,7 @@ import javax.annotation.Nonnull;
public class AuthenticationThreadLocalAccessor
implements ThreadLocalAccessor<Authentication> {
static final String KEY = "cp.hs.auth";
static final Object KEY = Authentication.class;
static {
ReactiveAuthenticationHolder.addSupplier(

View File

@@ -161,5 +161,11 @@
<artifactId>hsweb-easy-orm-core</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>context-propagation</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,30 @@
package org.hswebframework.web.i18n;
import io.micrometer.context.ThreadLocalAccessor;
import javax.annotation.Nonnull;
import java.util.Locale;
public class LocaleThreadLocalAccessor implements ThreadLocalAccessor<Locale> {
@Override
@Nonnull
public Object key() {
return Locale.class;
}
@Override
public Locale getValue() {
return LocaleUtils.CONTEXT_THREAD_LOCAL.getIfExists();
}
@Override
public void setValue() {
LocaleUtils.CONTEXT_THREAD_LOCAL.remove();
}
@Override
public void setValue(@Nonnull Locale value) {
LocaleUtils.CONTEXT_THREAD_LOCAL.set(value);
}
}

View File

@@ -35,7 +35,7 @@ public final class LocaleUtils {
public static final Locale DEFAULT_LOCALE = Locale.getDefault();
private static final FastThreadLocal<Locale> CONTEXT_THREAD_LOCAL = new FastThreadLocal<>();
static final FastThreadLocal<Locale> CONTEXT_THREAD_LOCAL = new FastThreadLocal<>();
static MessageSource messageSource = UnsupportedMessageSource.instance();

View File

@@ -0,0 +1 @@
org.hswebframework.web.i18n.LocaleThreadLocalAccessor

View File

@@ -0,0 +1,32 @@
package org.hswebframework.web.i18n;
import org.junit.jupiter.api.Test;
import reactor.core.publisher.Hooks;
import reactor.core.scheduler.Schedulers;
import java.util.Locale;
import static org.junit.jupiter.api.Assertions.*;
class LocaleThreadLocalAccessorTest {
static {
Hooks.enableAutomaticContextPropagation();
}
@Test
void testInReactive() {
for (Locale availableLocale : Locale.getAvailableLocales()) {
assertEquals(availableLocale,
LocaleUtils.doWith(
availableLocale,
() -> LocaleUtils
.currentReactive()
.subscribeOn(Schedulers.boundedElastic())
.block()));
}
}
}