如何在 Spring WebFlux 中获取语言环境?

How to get locale in Spring WebFlux?

我想获取当前语言环境,但上下文总是 return 默认语言环境。它适用于 MVC,但不适用于 WebFlux。

感谢您的帮助!

package co.example.demo.controller;

import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Locale;

@RestController
@RequestMapping("/hello")
public class HelloController {
    private final MessageSource messageSource;

    public HelloController(MessageSource messageSource) {
        this.messageSource = messageSource;
    }

    @GetMapping
    public String hello() {
        Locale locale = LocaleContextHolder.getLocale();
        return messageSource.getMessage("hello", null, locale);
    }
}

不要在 WebFlux 环境中使用 LocaleContextHolder,而是添加 Locale 作为方法参数:

@RestController
public class LocaleController {
    @GetMapping("/locale")
    String getLocale(Locale locale) {
        return locale.toLanguageTag();
    }
}

测试:

$ curl localhost:8080/locale -H 'Accept-Language: en-US'
en-US
$ curl localhost:8080/locale -H 'Accept-Language: en-GB'
en-GB

有关详细信息,请参阅:

早些时候我在我的项目中使用 spring-web 依赖项,并且能够从 WebRequest 获取语言环境。

但是当我们将项目从 spring-web 迁移到 spring-web-flux 时,我们可以使用 LocaleContextHolder 获取语言环境,如下所示:

Locale locale = LocaleContextHolder.getLocale();