Spring LocalResolver 基于查询参数“lang=en”?

我可以告诉spring-boot自动解析查询参数所请求locale的,例如&lang=en吗?


我想让查询参数优先于Accept-Language参数。


我发现了以下两个属性,但与查询参数无关。


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


九州编程
浏览 199回答 2
2回答

红糖糍粑

解决办法大概如下。我仍然发现设置非常违反直觉。特别是我会期望:将LocaleChangeInterceptor自身注册,但不并有来电addInterceptors()显该spring.mvc.locale参数仍然设置到自定义 LocaleResolver 中,但不会并且必须从WebMvcProperties如果需要所有这些,文档可能需要对此进行更多解释。@Configurationpublic 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;    }}讨论后更新改进版本:@Configurationpublic 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;    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java