В противном случае вы можете увидеть некоторые неприятные отображения китайских иероглифов.

ько начинаю новый проект, основанный на Spring boot 2 + Webflux. По обновлению версии пружины загрузи и замениspring-boot-starter-web с участиемspring-boot-starter-webflux классы как

WebMvcConfigurerAdapterLocaleResolverLocaleChangeInterceptor

не хватает. Как теперь я могу настроить defaultLocale и перехватчик для изменения языка?

 ronielhcuervo12 дек. 2017 г., 15:55
Проверьтеdocs.spring.io/spring/docs/current/spring-framework-reference/... используя LocaleContextResolver.
 mod09 апр. 2018 г., 13:08
Надеюсь это поможетссылка
 GVArt13 дек. 2017 г., 12:03
@virsha прочитай еще раз мой вопрос. У меня нет этого лица. Они являются частью зависимости mvc, которую я использую вместо webflux
 virsha13 дек. 2017 г., 11:36
Не могли бы вы предоставить содержимое WebMvcConfigurerAdapter, LocaleResolver, LocaleChangeInterceptor? Вы продлили этот класс для ваших целей?
 Hantsy15 дек. 2017 г., 15:02
Spring webflux имеет адаптер конфигуратора webflux для конфигурации webflux, например. видетьВот, Похоже наWebMvcConfigurerAdapterВы можете найти все дополнительные настройки, предоставленные вWebFluxConfigurer.

Ответы на вопрос(2)

DelegatingWebFluxConfigurationLocaleContextResolver

Например, чтобы использовать параметр запроса «lang» для явного управления языком, вы можете сделать:

Реализуйте LocaleContextResolver так, чтобы resolLocaleContext () возвращал SimpleLocaleContext, определяемый значением «lang». Я называю эту реализацию QueryParamLocaleContextResolver. Обратите внимание, что по умолчанию LocaleContextResolver - org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver.

Создайте класс @Configuration, который расширяет DelegatingWebFluxConfiguration. Переопределите DelegatingWebFluxConfiguration.localeContextResolver () для возврата QueryParamLocaleContextResolver, который мы только что создали на шаге 1. Назовите этот класс конфигурации WebConfig.

В WebConfig переопределите DelegatingWebFluxConfiguration.configureViewResolvers () и добавьте компонент ThymeleafReactiveViewResolver в качестве средства разрешения представления. Мы делаем это потому, что по какой-то причине DelegatingWebFluxConfiguration пропустит ThymeleafReactiveViewResolver после шага 2. Нам просто нужно это исправить.

Также я должен упомянуть, что для использования i18n с реактивным стеком необходим этот компонент:

    @Bean
    public MessageSource messageSource() {
        final ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasenames("classpath:/messages");
        messageSource.setUseCodeAsDefaultMessage(true);
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setCacheSeconds(5);
        return messageSource;
}

После создания естественного шаблона, некоторых файлов свойств и контроллера вы должны достичь этого:

localhost: 8080 / test? lang = zh дает вам китайскую версию

localhost: 8080 / test? lang = en дает вам английскую версию

Просто не забудь<meta charset="UTF-8">в<head>В противном случае вы можете увидеть некоторые неприятные отображения китайских иероглифов.

Просто добавьтеWebFilter это устанавливаетAccept-Language заголовок из значения параметра запроса. Следующий пример получает язык изязык параметр запроса на URI, такие какhttp://localhost:8080/examples?language=es:

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.event.EventListener;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import org.springframework.web.server.adapter.DefaultServerWebExchange;
import org.springframework.web.server.adapter.HttpWebHandlerAdapter;
import reactor.core.publisher.Mono;

import static org.springframework.util.StringUtils.isEmpty;

@Component
public class LanguageQueryParameterWebFilter implements WebFilter {

    private final ApplicationContext applicationContext;

    private HttpWebHandlerAdapter httpWebHandlerAdapter;

    public LanguageQueryParameterWebFilter(final ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @EventListener(ApplicationReadyEvent.class)
    public void loadHttpHandler() {
        this.httpWebHandlerAdapter = applicationContext.getBean(HttpWebHandlerAdapter.class);
    }

    @Override
    public Mono<Void> filter(final ServerWebExchange exchange, final WebFilterChain chain) {
        final ServerHttpRequest request = exchange.getRequest();
        final MultiValueMap<String, String> queryParams = request.getQueryParams();
        final String languageValue = queryParams.getFirst("language");

        final ServerWebExchange localizedExchange = getServerWebExchange(languageValue, exchange);
        return chain.filter(localizedExchange);
    }

    private ServerWebExchange getServerWebExchange(final String languageValue, final ServerWebExchange exchange) {
        return isEmpty(languageValue)
                ? exchange
                : getLocalizedServerWebExchange(languageValue, exchange);
    }

    private ServerWebExchange getLocalizedServerWebExchange(final String languageValue, final ServerWebExchange exchange) {
        final ServerHttpRequest httpRequest = exchange.getRequest()
                .mutate()
                .headers(httpHeaders -> httpHeaders.set("Accept-Language", languageValue))
                .build();

        return new DefaultServerWebExchange(httpRequest, exchange.getResponse(),
                httpWebHandlerAdapter.getSessionManager(), httpWebHandlerAdapter.getCodecConfigurer(),
                httpWebHandlerAdapter.getLocaleContextResolver());
    }
}

Оно использует@EventListener(ApplicationReadyEvent.class) во избежание циклических зависимостей.

Не стесняйтесь протестировать его и оставить отзыв об этом POC.

 Peter22 окт. 2018 г., 16:27
Этот ответ так недооценен. Спасибо за эту замечательную реализацию!

Ваш ответ на вопрос