SpringMVC国际化设置-Cannot change HTTP accept header - use a different locale resolution strategy

使用SpringMVC3配置国际化,最近遇到了“Cannot change HTTP accept header - use a different locale resolution strategy” 这样的异常提示,最终解决了。现在来说说有关SpringMVC配置国际化的步骤及注意点,最后结合Spring源码解析下原理。

国际化最常需要解决的问题

  1. 页面上能够根据浏览器设置的语言来动态展现文本,数值,时间等;
  2. 可以在Bean中获取设置的Locale信息;
  3. 可以通过动态链接的方式来切换locale信息。

以下以demo的方式来说明以上三个问题的常用解决方法。

问题1,解决方式如下:

配置ResourceBundleMessageSource解析器,配置springmvc.xml如下:

<!-- 国际化 -->
	<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="i18n"></property>
	</bean>

增加i18n.properties配置文件,demo像征性的配置了一个中文,一个英文的,如下图:

i18n.properties内容:

i18n.username = \u7528\u6237\u540D
i18n.password = \u5BC6\u7801

i18n_en_US.properties内容:

i18n.username = username
i18n.password = passsword

页面展现采用了JSTL的fmt标签:

<fmt:message key="i18n.username"></fmt:message>

有以上配置即可实现根据浏览器设置来展现 “用户名” 或是英文的 "username" 。


问题2,在JAVA中在Bean中获取locale设置信息

这个比较简单,在Bean中注入ResourceBundleMessageSource,即可获取到了,相关Java代码如下:

@Autowired
	private ResourceBundleMessageSource messageSource;

	/**
	 * 1.验证国际化配置根据本地语言配置动态,利用fmt标签动态展现
	 * 2.验证在Bean中获取国际化资源文件Locale对应的信息
	 */
	@RequestMapping("/i18n")
	public String testI18n(Locale locale) {
		String user = messageSource.getMessage("i18n.username", null, locale);
		System.out.println("国际化资源文件Locale配置(username):"+user);
		return "i18n";
	}

问题3,再简单描述下就是在页面上动态设置语言信息,即动态设置locale信息以达到切换展现的目的,如下图:

在实现这个问题时遇到一个了标题中所写的报错,究其原因单步源码发现是由于localeResovler默认注入的是org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver,我们查看下这个类的setLocale方法会发现出现异常的原因了。

public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
/* 45 */     throw new UnsupportedOperationException("Cannot change HTTP accept header - use a different locale resolution strategy");
/*    */   }

那么我们可以注入org.springframework.web.servlet.i18n.SessionLocaleResolver这个解析器来解决,这个解析器主要是将获取后Locale对象存于Session中供后续获取。

springmvc.xml配置如下:

<!-- 配置SessionLocaleResolver用于将Locale对象存储于Session中供后续使用 -->
	<bean id="localeResolver"
		class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>

<!-- 配置LocaleChangeInterceptor 主要用于获取请求中的locale信息,将期转为Locale对像,获取LocaleResolver对象-->
    <mvc:interceptors>
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
    </mvc:interceptors>

这里有个特别需要注意bean id的配置,值必须为localeResolver否则,仍然会报标题中的错误。

按以上操作之后,就可以不用去浏览器手工设置语言了,可以直接通过上图中的 “中文”,“英文”进行切换,相信有些朋友会遇到这样的需求。

结合单步源码的过程,这里理解的内部原理用下图表示下:

时间: 2024-08-02 08:36:41

SpringMVC国际化设置-Cannot change HTTP accept header - use a different locale resolution strategy的相关文章

SpringMVC国际化设置出现Cannot change HTTP accept header - use a different locale resolution strategy的BUG

在系统的学习SpringMVC过程并进行练习时,出现Cannot change HTTP accept header - use a different locale resolution strategy的BUG. 国际化需要可以满足三个需求 1.在页面上对时间.数值.标签等进行本地化处理 2.需要从bean中获取国际化的资源文件Locale对应的消息 3.可以通过超链接动态的切换Locale 实现方式: 首先先配置资源文件 i18n_zh_CN.properties中文配置文件 i18n.u

spring和springmvc国际化应用

目的: @1在视图层显示的文字显国际化 @2数据验证后显示国际化 @3通过超链接的参数,让客户自动选择国际化 1:在spring.xml中配置国际化类,让容器管理国际化 2:在页面显示国际化:可以使用spring的标签<st:message code="userName"></st:message> @2数据验证 1: 代码层数据验证:自动装配 MessageSource source java代码层根据不同的区域获取不同语言的错误信息,并将错误信息添加至结果中

基于session 的springMvc 国际化

项目中采用springMvc的框架,需要动态切换语言,找了一些资料,最后决定采用基于session的动态切换,实现动态切换中文,英文,韩文,其实就是把中文翻译成其他语言显示 springMvc国际化包括两个方面,一个是前台页面的国际化,spring有自己的标签可以去实现,非常方便,另一个是后台java代码种涉及中文的国际化. 1.项目总体结构 有关bean的主要配置在spring-mvc.xml里配置,messages文件夹里放的是需要翻译的内容格式如下:key  =  value 的格式 英文

Android国际化设置

Android中的国际化设置好简单啊,还直观. 设置界面上显示的文字的话,在对应的xml文件中,把显示的那些文字替换为资源文件的ID,就可以根据语言环境更新文字显示形式了. 图片中左侧菜单栏里的几个values是对应的语言环境的国际化文件: 中间红框是右侧页面显示的文字的来源,表示来源于string文件的某个id对应的内容

基于SpringMVC国际化资源配置方式

基于SpringMVC国际化资源配置方式. 1.首先需要在spring-mvc-servlet.xml 中配置拦截器: <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> 2.如果要浏览器自适应语言方式(cookie方式):还需要在spring-mvn-servlet.xml 中配置: 2.1

从content-type设置看Spring MVC处理header的一个坑

我们经常需要在HttpResponse中设置一些headers,我们使用Spring MVC框架的时候我们如何给Response设置Header呢? Sooooooooooooo easy, 看下面的代码: @RequestMapping(value = "/rulelist", method = RequestMethod.GET) @ResponseBody public String getRuleList(HttpServletRequest request, HttpServ

SpringMVC国际化支持

这周公司领导希望我对一个项目,出一个国际化的解决方案,研究两个小时,采用了SpringMVC的国际化支持,在此记录下. 原理: 在DispatchServlet中注册localeResolver(区域解析器),并添加Locale拦截器(LocaleChangeInterceptor),来检测请求中的参数和语言环境的改变.      在应用上下文中注册ResourceBundleMessageSource,定义国际化文件在程序中的路径和名称. 1. 语言解析器 在SpringMVC中,常用的语言解

学习SpringMVC——国际化+上传+下载

每个星期一道菜,这个星期也不例外~~~ 一个软件,一个产品,都是一点点开发并完善起来的,功能越来越多,性能越来越强,用户体验越来越好……这每个指标的提高都需要切切实实的做点东西出来,好比,你的这个产品做大了,用的人多了,不仅仅再是上海人用,北京人用,还有印度人用,法国人用等等,可以说这个产品已经走上了国际化的大舞台.当印度的哥们输入url访问产品时,界面上弹出“欢迎您,三哥”,估计哥们当场就蒙圈了.而这个时候,国际化就应运而生了. 要做国际化这道菜,真的没有想象中的那么复杂,反而很简单,不信你看

SpringMVC国际化

如何将我们网站的其它内容(如菜单.标题等)做国际化处理呢?这就是本篇要将的内容->国际化. 一.基于浏览器请求的国际化实现: 首先配置我们项目的springservlet-config.xml文件添加的内容如下: <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <!-- 国际化信息所在的文件名 -