最近公司准备推出国际化的内容了,这个调整对我们来说其实不小的。主要是 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 问题解决方法
原创文章,作者:1402239773,如若转载,请注明出处:https://blog.ytso.com/252018.html