Поведение весенней загрузки LocaleChangeInterceptor в многопоточной среде - PullRequest
0 голосов
/ 17 июня 2020

Я использую следующий класс для управления локализацией в моем приложении весенней загрузки.

@Configuration
public class MessageConfig implements WebMvcConfigurer {

    private Logger logger = LoggerFactory.getLogger(MessageConfig.class);
    /**
     * Message source for localization.
     * @return message source.
     */
    @Bean
    public MessageSource messageSource() {
        if (logger.isDebugEnabled()) {
            logger.debug("Creating a ResourceBundleMessageSource.");
        }
        ResourceBundleMessageSource source = new ResourceBundleMessageSource();
        source.setBasename("messages");
        source.setUseCodeAsDefaultMessage(true);
        return source;
    }

    /**
     * Utility for localization.
     * @return locale resolver.
     */
    @Bean
    public LocaleResolver localeResolver() {
        if (logger.isDebugEnabled()) {
            logger.debug("Creating a locale resolver.");
        }
        SessionLocaleResolver slr = new SessionLocaleResolver();
        slr.setDefaultLocale(Locale.US);
        return slr;
    }

    /**
     * Utility for localization.
     * @return locale change interpreter.
     */
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        if (logger.isDebugEnabled()) {
            logger.debug("Creating a locale change interceptor.");
        }
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        lci.setParamName("lang");
        return lci;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        if (logger.isDebugEnabled()) {
            logger.debug("Adding locale change interceptor to registry.");
        }
        registry.addInterceptor(localeChangeInterceptor());
    }

}

Мое приложение решает, какой языковой стандарт будет использоваться на основе параметра lang URL, отправленного в API.

Когда я отправляю localhost:8080/api, он отправляет контент на языке по умолчанию, которым является английский sh. Если я отправлю localhost:8080/api?lang=si, он отправит контент на сингальском языке.

Однако, если я отправлю запрос на localhost:8080/api без указания языка, я получу контент на сингальском языке, который использовался в предыдущем вызове вместо языкового стандарта по умолчанию. Я использую LocaleContextHolder на уровне обслуживания, чтобы определить содержимое вывода. Насколько я понимаю, каждый отдельный вызов API будет обрабатываться новым потоком. Итак, почему языковой стандарт по умолчанию был изменен на 'si' в этом вызове API, даже если я не указал язык?

Ответы [ 2 ]

1 голос
/ 18 июня 2020

LocaleChangeInterceptor изменяет язык в зависимости от того, присутствует параметр запроса или нет. Если этот параметр присутствует, он получит Locale и использует метод LocaleResolver.setLocale, чтобы изменить язык для текущего пользователя.

Весь код, которому требуется Locale для перевода сообщений, использует метод LocaleResolver.resolveLocale для его получения.

Теперь, когда вы используете SessionLocaleResolver, он будет сохранен в пользовательских HttpSession. Поэтому после его изменения он останется таким же для текущего сеанса http НЕ для другого сеанса. Если вы удалите сеанс Cook ie в своем браузере, он снова станет языком по умолчанию.

Вы можете проверить это, открыв новый другой браузер (не тот браузер, который будет копировать состояние сеанса) или окно вашего браузера в режиме инкогнито и проверьте свой сайт. Он по-прежнему будет на языке по умолчанию, а не на измененном.

1 голос
/ 17 июня 2020

SessionLocaleResolver извлекает языковой стандарт из сеанса пользователя. Я предполагаю, что после того, как языковой стандарт установлен, он использует ранее установленное значение. Из docs :

LocaleResolver реализация, которая использует атрибут языкового стандарта в пользовательском сеансе в случае настраиваемой настройки, с откатом на указанный языковой стандарт по умолчанию или запрос accept- локаль заголовка.

Что касается того, почему он не меняется, это, вероятно, потому, что LocaleChangeInterceptor не запускается, когда вы запрашиваете /api без параметра lang.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...