クエリパラメータに基づいて、春LocalResolver「LANG = en」と?

membersound:

私が言うことができspring-boot、自動的に要求された解決するためにlocale例えば、queryparameterで&lang=en

私は上のクエリのparam優先させていただきたいと思いAccept-Languageパラメータ。

私は、次の2つのプロパティを見つけませんが、クエリのparamについては何も。

spring.mvc.locale= # Locale to use. By default, this locale is overridden by the "Accept-Language" header.
spring.mvc.locale-resolver=accept-header # Define how the locale should be resolved.

例外を与える、次のように私が試しました:

@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {
   @Bean
   public LocaleChangeInterceptor localeChangeInterceptor() {
       LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
       lci.setParamName("lang");
       return lci;
   }

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(localeChangeInterceptor());
   }
}

での結果:

java.lang.UnsupportedOperationException: Cannot change HTTP accept header - use a different locale resolution strategy

membersound:

次のように解決策は、おそらくです。それでも私は非常に直観に反しセットアップを見つけます。特に、私はそれを期待しているだろう。

  • LocaleChangeInterceptorレジスタそのものではなく、呼び出す必要はありませんし、addInterceptors()明示的な
  • spring.mvc.localeパラメータは、まだカスタムLocaleResolverに設定されていますが、およびから手動で上書きする必要はありません。WebMvcProperties

このすべてが必要な場合は、ドキュメントは、おそらくこれに関する詳細な説明が必要になる場合があります。

@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {
   @Bean
   public LocaleChangeInterceptor localeChangeInterceptor() {
       LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
       lci.setParamName("lang");
       return lci;
   }

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(localeChangeInterceptor());
   }

   @Bean
   public AcceptHeaderLocaleResolver localeResolver(WebMvcProperties mvcProperties) {
        AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver() {
            @Override
            public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
                LocaleContextHolder.setLocale(locale);
            }
        };

        localeResolver.setDefaultLocale(mvcProperties.getLocale());
        return localeResolver;
    }
}

議論の後に改良版を更新します。

@Configuration
public class AppConfig implements WebMvcConfigurer {
   @Bean
   public AcceptHeaderLocaleResolver localeResolver(WebMvcProperties mvcProperties) {
        AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver() {
        @Override
        public Locale resolveLocale(HttpServletRequest request) {
            String locale = request.getParameter("lang");
            return locale != null
                    ? org.springframework.util.StringUtils.parseLocaleString(locale)
                    : super.resolveLocale(request);
        }
        };

        localeResolver.setDefaultLocale(mvcProperties.getLocale());
        return localeResolver;
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=218935&siteId=1