Cannot change HTTP accept header – use a different locale resolution strategy 问题解决方法

最近公司准备推出国际化的内容了,这个调整对我们来说其实不小的。主要是 APP 端,网页端,小程序端,公众号,H5 等各渠道都要支持。

同事在进行国际化时,遇到了一个异常,详情如下:

java.lang.UnsupportedOperationException: Cannot change HTTP accept header – use a different locale resolution strategy
    at org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver.setLocale(AcceptHeaderLocaleResolver.java:140)

这个异常的大概意思是说:无法更改 HTTP 的 accept header 请求数据,实际上是无法改变 HTTP 请求头中的 accept-language 属性值。所以想要改变国际化的 Locale,请使用其他 Locale 解析策略。

产生这个问题的原因是 Spring Boot 默认使用的国际化区域解析器是 AcceptHeaderLocaleResolver。它通过检验 HTTP 请求的 accept-language 头部来解析区域。这个头部是由用户的 web 浏览器根据底层操作系统的区域设置进行设定。这个区域解析器无法改变用户的区域,因为它无法修改用户操作系统的区域设置。

所以说,类似下面的功能就不被支持。

@RequestMapping("/change")
public String changeI18n(HttpServletRequest request, 
	HttpServletResponse response, String lang){
    LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
    if("zh".equals(lang)){
        localeResolver.setLocale(request, response, new Locale("zh","CN"));
    }else if("en".equals(lang)){
        localeResolver.setLocale(request, response, new Locale("en","US"));
    }
    return "OK";
}

想要支持,就必须使用 SessionLocaleResolver 或者 CookieLocaleResolver 解析器。或者自定义解析器。需要注意的是 FixedLocaleResolver 也不能改变 Local 的设置。

想要支持 SessionLocaleResolver 或者 CookieLocaleResolver 的做法很简单,具体用法如下:

@Bean
public LocaleResolver localeResolver(){
    final SessionLocaleResolver localeResolver = new SessionLocaleResolver();
    //final CookieLocaleResolver localeResolver = new CookieLocaleResolver();
    localeResolver.setDefaultLocale(new Locale("en", "US"));
    return localeResolver;
}

在 @Configuration 类中,加入上面的代码即可。

如果是 Spring MVC 的话,就配置 SessionLocaleResolver 或 CookieLocaleResolver 的 bean 实例即可。

<bean id="localeResolver"
 class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
 <!-- 
 <bean id="localeResolver"
 class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
  -->

至于具体是用 SessionLocaleResolver 还是 CookieLocaleResolver 根据你们的实际使用常见来。

参考资料

  • Cannot change HTTP accept header – use a different locale resolution strategy

Cannot change HTTP accept header – use a different locale resolution strategy 问题解决方法

: » Cannot change HTTP accept header – use a different locale resolution strategy 问题解决方法

原创文章,作者:1402239773,如若转载,请注明出处:https://blog.ytso.com/252018.html

(0)
上一篇 2022年5月3日
下一篇 2022年5月3日

相关推荐

发表回复

登录后才能评论