Как добавить пользовательский LocaleResolverConfiguration в webflux - PullRequest
0 голосов
/ 02 июля 2019

Я добавил следующее @Bean в classpath для переопределения по умолчанию LocaleContextResolver весной webflux

@Configuration
public class LocaleResolverConfiguration {

  @Bean(WebHttpHandlerBuilder.LOCALE_CONTEXT_RESOLVER_BEAN_NAME)
  public LocaleContextResolver localeContextResolver() {
    return new LocaleContextResolver() {
      @Override
      public LocaleContext resolveLocaleContext(ServerWebExchange exchange) {
        final String langParam = exchange.getRequest().getQueryParams().getFirst("lang");
        if (langParam == null) {
          return new SimpleLocaleContext(Locale.getDefault());
        } else {
          return new SimpleLocaleContext(Locale.forLanguageTag(langParam));
        }
      }

      @Override
      public void setLocaleContext(ServerWebExchange exchange, LocaleContext localeContext) {
        throw new UnsupportedOperationException(
            "Cannot change HTTP accept header - use a different locale context resolution strategy");
      }
    };
  }

}

Но запуск приложения завершился неудачно со следующей ошибкой

The bean 'localeContextResolver', defined in class path resource [org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration$EnableWebFluxConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [com/acme/webflux/config/LocaleResolverWebFluxConfiguration.class] and overriding is disabled.

Почему webflux не отступает, когда мы уже предоставили свой LocaleContextResolver localeContextResolver()?

Есть ли какой-то другой способ добиться того же?

1 Ответ

0 голосов
/ 02 июля 2019

Я сделал следующий хак, так как не смог найти разумного способа изменить localeContextResolver без избавления от автоконфигурации. Но это всего лишь взлом, а не разумное решение

@Configuration
public class LocaleResolverConfiguration {

  @Bean
  public CommandLineRunner localeContextResolverCustomizer(HttpHandler httpHandler) {
    assert httpHandler instanceof HttpWebHandlerAdapter;
    return args -> {
      ((HttpWebHandlerAdapter) httpHandler).setLocaleContextResolver(new LocaleContextResolver() {
        @Override
        public LocaleContext resolveLocaleContext(ServerWebExchange exchange) {
          final String langParam = exchange.getRequest().getQueryParams().getFirst("lang");
          if (langParam == null) {
            return new SimpleLocaleContext(Locale.getDefault());
          } else {
            return new SimpleLocaleContext(Locale.forLanguageTag(langParam));
          }
        }

        @Override
        public void setLocaleContext(ServerWebExchange exchange, LocaleContext localeContext) {
          throw new UnsupportedOperationException("Cannot change HTTP parameter - use a different locale context resolution strategy");
        }
      });
    };
  }

}
...