diff --git a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/context/AuthenticationThreadLocalAccessor.java b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/context/AuthenticationThreadLocalAccessor.java index 49c097523..dca294326 100644 --- a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/context/AuthenticationThreadLocalAccessor.java +++ b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/context/AuthenticationThreadLocalAccessor.java @@ -10,7 +10,7 @@ import javax.annotation.Nonnull; public class AuthenticationThreadLocalAccessor implements ThreadLocalAccessor { - static final String KEY = "cp.hs.auth"; + static final Object KEY = Authentication.class; static { ReactiveAuthenticationHolder.addSupplier( diff --git a/hsweb-core/pom.xml b/hsweb-core/pom.xml index 8ce8abbb8..f6197b460 100644 --- a/hsweb-core/pom.xml +++ b/hsweb-core/pom.xml @@ -161,5 +161,11 @@ hsweb-easy-orm-core + + io.micrometer + context-propagation + true + + \ No newline at end of file diff --git a/hsweb-core/src/main/java/org/hswebframework/web/i18n/LocaleThreadLocalAccessor.java b/hsweb-core/src/main/java/org/hswebframework/web/i18n/LocaleThreadLocalAccessor.java new file mode 100644 index 000000000..16cdee737 --- /dev/null +++ b/hsweb-core/src/main/java/org/hswebframework/web/i18n/LocaleThreadLocalAccessor.java @@ -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 { + + @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); + } +} diff --git a/hsweb-core/src/main/java/org/hswebframework/web/i18n/LocaleUtils.java b/hsweb-core/src/main/java/org/hswebframework/web/i18n/LocaleUtils.java index 0477dfa5a..f769b41d5 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/i18n/LocaleUtils.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/i18n/LocaleUtils.java @@ -35,7 +35,7 @@ public final class LocaleUtils { public static final Locale DEFAULT_LOCALE = Locale.getDefault(); - private static final FastThreadLocal CONTEXT_THREAD_LOCAL = new FastThreadLocal<>(); + static final FastThreadLocal CONTEXT_THREAD_LOCAL = new FastThreadLocal<>(); static MessageSource messageSource = UnsupportedMessageSource.instance(); diff --git a/hsweb-core/src/main/resources/META-INF/services/io.micrometer.context.ThreadLocalAccessor b/hsweb-core/src/main/resources/META-INF/services/io.micrometer.context.ThreadLocalAccessor new file mode 100644 index 000000000..47190e2b8 --- /dev/null +++ b/hsweb-core/src/main/resources/META-INF/services/io.micrometer.context.ThreadLocalAccessor @@ -0,0 +1 @@ +org.hswebframework.web.i18n.LocaleThreadLocalAccessor \ No newline at end of file diff --git a/hsweb-core/src/test/java/org/hswebframework/web/i18n/LocaleThreadLocalAccessorTest.java b/hsweb-core/src/test/java/org/hswebframework/web/i18n/LocaleThreadLocalAccessorTest.java new file mode 100644 index 000000000..e0384d5b9 --- /dev/null +++ b/hsweb-core/src/test/java/org/hswebframework/web/i18n/LocaleThreadLocalAccessorTest.java @@ -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())); + } + + + } +} \ No newline at end of file