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

JAVA herman 614浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

最近公司准备推出国际化的内容了,这个调整对我们来说其实不小的。主要是 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 根据你们的实际使用常见来。

参考资料

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号1:xmtxtt(5000人已满),微信号2:codedq(5000人已满),微信号3:xttblog(超2800)。备注:“xttblog”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » Cannot change HTTP accept header – use a different locale resolution strategy 问题解决方法