Spring WebFlux中i18n的循序渐进指南
2019-01-22 08:30:59

在我们之前的文章中,我们已经讨论过如何使用Spring Boot和Spring MVC实现国际化。在Spring WebFlux的i18n指南中,我们将在Spring WebFlux中创建一个具有国际化和本地化支持的Web应用程序。首先,我们将介绍所有基本步骤,以使用Spring Boot 2.0和Spring WebFlux创建一个简单的Web应用程序。此外,我们将添加必要的配置以支持国际化和本地化。此外,我们将使用Thymeleaf作为模板引擎。因此,我们希望读者具备Maven,Spring Boot,Spring WebFlux和Thymeleaf的基本知识。
项目设置
让我们回顾一下设置项目的基础知识,让事情滚动......
依赖
首先,我们将pom.xml中的项目父级声明为 spring-boot-starter-parent。然后,我们为Spring WebFlux和Thymeleaf添加依赖项,如下所示:
事实上,最新的Spring Boot版本可以在Maven Central上找到。
同时,请注意我们在本文中使用Java 9。因此,声明如下:
组态
我们创建一个WebConfig 类并使用@Configuration注释进行装饰,如下所示:
在上面的代码中, WebConfig实现了 ApplicationContextAware, 以允许我们访问ApplicationContext。此外,我们还需要实现WebFluxConfigurer,因为这将使我们以后可以注册我们的ViewResolver。
另外,我们用@EnableWebFlux注释装饰该类。这将允许使用带注释的控制器和功能端点。但是,只有一个@Configuration类应该具有@EnableWebFlux注释。
使用Thymeleaf作为模板引擎
Thymeleaf 作为一个强调自然HTML模板的现代服务器端Java模板引擎,提供了一种与Spring 5 WebFlux集成的反应友好方式:
正如我们在这里看到的,我们需要一个模板解析器,一个模板引擎和一个视图解析器作为必要的设置。
例如,我们使用 SpringResourceTemplateResolver作为Template Resolver的实现。这是我们指定模板文件的位置和文件扩展名的地方。在本文中,我们的模板将采用HTML格式。
在那之后,我们分配的是模板解析器的模板引擎这是 SpringWebFluxTemplateEngine。同样,模板引擎由View Resolver引用, 它是 ThymeleafReactiveViewResolver 。
最后,我们通过覆盖WebFluxConfigurer接口的 configureViewResolvers方法将 View Resolver注册到Spring 。
接下来,我们可以将资源/视图下的示例index.html文件作为模板。文件内容是:
处理程序和路由器
在此之前,我们可以创建一个WelcomeHandler,它将返回index.html模板:
在Spring WebFlux中,我们需要一个路由器将请求路由到相应的处理程序。让我们创建一个WelcomeRouter,如下所示:
因此,请求来到/ index,将由WelcomeHandler.hello方法处理。
运行应用程序
此时,我们添加以下类来运行我们的Spring Boot应用程序:

现在运行我们的应用程序并访问位于http:// localhost:8080 / index的服务器 。 我们将看到以下结果:

I18n在Spring WebFlux中
我们现在已经达到了开始实施i18n和l10n的程度......
MessageSource配置
为了在我们的项目中支持多种语言,我们需要为每种支持的语言声明一个消息属性文件。
让我们在资源/语言下添加 messages.properties来提供默认语言:
另外,我们可以添加 messages_de.properties, messages_fr.properties和 messages_zh.properties。这将增加支持德语,法语和中文的能力。
同时,我们可以看到消息属性文件包含一组键对值。我们稍后将使用该键在我们的视图中引用所需的消息。
之后,我们需要告诉Spring我们将消息属性文件放在哪里。因此,我们在WebConfig中声明一个MessageSource bean,如下所示:
自定义LocaleContextResolver
可以使用LocaleContextResolver的两种实现 :
AcceptHeaderLocaleContextResolver:使用HTTP请求的“Accept-Language”标头中指定的主要区域设置。这是默认值。
FixedLocaleContextResolver:始终返回固定的语言环境和可选的时区
在本文中,我们将尝试实现自定义 LocaleContextResolver。它的目的是从请求参数解析语言环境:
此外,我们需要告诉Spring将我们的实现用作LocaleContextResolver。因此,我们添加了一个扩展DelegatingWebFluxConfiguration类的配置 类。然后,我们将覆盖createLocaleContextResolver方法 以返回我们的自定义实现:
欢迎页面
到目前为止,我们已准备好配置。让我们创建一个welcome.html模板,如下所示:
以上模板使用Thymeleaf语法呈现本地化消息。实际上,将根据所选语言环境在运行时选择真实消息。
除此之外,我们还需要更新WelcomeHandler和WelcomeRouter以使用此模板:
测试
总之,我们的项目已准备好进行最终测试。让我们启动应用程序并访问 http:// localhost:8080 / welcome:

然后,单击法国锚点。你会看到什么:

既然如此,我们已经成功建立了一个支持I18N的Spring WebFlux项目。
摘要
让我们总结一下我们在本文中所做的工作。
首先,我们提出了一个使用Thymeleaf作为模板引擎的Spring WebFlux项目。 随后,我们使用message.properties, MessageResource和LocaleContextResolver为项目添加了 国际化和本地化支持。
无论LocaleContextResolver的两个可用实现 如何,我们都尝试实现自定义 RequestParamLocaleContextResolver。因此,我们可以通过更改请求参数来更改应用程序区域设置。