我刚开始一个基于Sping Boot 2 + Webflux的新项目。在升级Spring Boot版本时,用spring-boot-starter-webflux
类替换spring-boot-starter-web
,如
- WebMvc配置器适配器
- 本地解析程序
- 本地更改拦截器
现在我如何配置defaultLocale和拦截器来更改语言?
我刚开始一个基于Sping Boot 2 + Webflux的新项目。在升级Spring Boot版本时,用spring-boot-starter-webflux
类替换spring-boot-starter-web
,如
现在我如何配置defaultLocale和拦截器来更改语言?
5条答案
按热度按时间q8l4jmvw1#
只需添加一个
WebFilter
,它根据查询参数的值设置Accept-Language
标头。以下示例从http://localhost:8080/examples?language=es
等URI上的language查询参数获取语言:它使用
@EventListener(ApplicationReadyEvent.class)
以避免循环依赖。请随意测试它并提供有关此POC的反馈。
myss37ts2#
使用Spring启动器webflux,有
例如,要使用查询参数“lang”显式控制语言环境:
1.实现
LocaleContextResolver
,使resolveLocaleContext()
返回由“lang”的GET参数确定的SimpleLocaleContext
,我将此实现命名为QueryParamLocaleContextResolver
,注意默认的LocaleContextResolver
是org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver
。1.创建一个扩展
DelegatingWebFluxConfiguration
的@Configuration
类。重写DelegatingWebFluxConfiguration.localeContextResolver()
以返回我们刚刚在步骤1中创建的QueryParamLocaleContextResolver
。将此配置类命名为WebConfig
。1.在
WebConfig
中,覆盖DelegatingWebFluxConfiguration.configureViewResolvers()
并添加ThymeleafReactiveViewResolver
bean作为视图解析器,我们这样做是因为,由于某些原因,DelegatingWebFluxConfiguration
在步骤2之后将错过ThymeleafReactiveViewResolver
。另外,我必须提到,要将i18n与React堆栈一起使用,这个bean是必需的:
在创建了一个自然模板、一些属性文件和一个控制器之后,您将看到:
localhost:8080/test?lang=zh
为您提供中文版本localhost:8080/test?lang=en
为您提供英语版本只是不要忘记
<head>
中的<meta charset="UTF-8">
,否则您可能会看到一些讨厌的中文字符显示。qyyhg6bp3#
从Sping Boot 2.4.0开始,
WebFluxAutoConfiguration
包含了LocaleContextResolver
的bean定义,它允许我们注入自定义的LocaleContextResolver
。下面是Spring Boot 2.5.4中的默认bean定义(在早期版本中实现可能有所不同),以供参考:您可以提供自己的
LocaleContextResolver
实现,以便通过提供自定义bean定义从查询参数获取语言环境:注意,框架使用具有特定名称
localeContextResolver
(WebHttpHandlerBuilder.LOCALE_CONTEXT_RESOLVER_BEAN_NAME
)的LocaleContextResolver
。您需要提供具有给定名称的bean。请参见#24209。slhcrj9b4#
spring boot starter web flux的另一个解决方案要干净得多,那就是使用
WebHttpHandlerBuilder
定义自己的HttpHandler
,在WebHttpHandlerBuilder
中可以设置你的LocaleContextResolver
。文档(参见1.2.2. WebHandler API):www.example.comhttps://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-config-customize
然后在一个配置文件(用
@Configuration
注解)或您的springboot应用程序文件中,定义您自己的HttpHandler
bean。就是这样!
apeeds0o5#
根据Jonatan门多萨的回答,但简化了,用的是Kotlin的话: