为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

九州编程 2021-07-19 16:12:11
我可以告诉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.我尝试如下,这给出了一个例外:@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());   }}结果是:java.lang.UnsupportedOperationException: Cannot change HTTP accept header - use a different locale resolution strategy
查看完整描述

2 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

解决办法大概如下。我仍然发现设置非常违反直觉。特别是我会期望:

  • 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;

    }

}


查看完整回答
反对 回复 2021-07-23
  • 2 回答
  • 0 关注
  • 198 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信