Spring MVC:spring:message和request locale之间的区别

时间:2013-09-16 16:09:42

标签: java spring spring-mvc tags locale

我有一些不一致的地方,我需要一些专家建议。我正在使用Spring MVC 3.2

拥有这个豆子:

<bean id="messageSource"
  class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages" />
    <property name="defaultEncoding" value="UTF-8"/>
    <property name="cacheSeconds" value="10" /> <!-- for easier development -->
</bean>

<bean id="localeChangeInterceptor"
  class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="lang" />
</bean>

<bean id="localeResolver"
  class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="en"/>
</bean>

两个不同的消息文件:

messages.properties
messages_es.properties

使用spring标记时,语言环境解析为“es”并按预期使用messages_es(这是我的系统语言)。

但是,如果我尝试以编程方式获取语言环境,我总是得到“en”。我尝试过这个选项:

选项1:

@Autowired
private LocaleResolver localeResolver;
....
localeResolver.resolveLocale(request);

选项2:

LocaleContextHolder.getLocale();

选项3:

RequestContextUtils.getLocale(request);

所有这些都以“en”lang结果。

问题是,如何获取spring:message tag ??

使用的语言环境

根据文件,

  

当请求进入时,DispatcherServlet会查找区域设置解析程序,如果找到,则会尝试使用它来设置区域设置。使用RequestContext.getLocale()方法,您始终可以检索由区域设置解析程序解析的区域设置。

但最终html中的所有文本都在“es”中,此方法返回“en”

3 个答案:

答案 0 :(得分:1)

通常,可以使用RequestContext.getLocale()reference)以编程方式访问区域设置。

但是,在控制器的@RequestMapping处理程序方法中,您可以依靠Spring来获取Locale。 由于Localesupported argument type,因此只需声明类型为Locale的变量作为控制器方法的参数即可访问当前区域设置。

<强>拦截
在显示的配置中,locale拦截器被声明为bean,但未注册为拦截器。试试这个,来自Spring documentation

<bean id="handlerMapping"
      class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="localeChangeInterceptor"/>
        </list>
    </property>
</bean>

或者,从Spring 3.0开始,您可以使用mvc:interceptors

<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>

答案 1 :(得分:1)

好吧,我会自己回答。我深入调试它,发现问题是ReloadableResourceBundleMessageSource定义中缺少的属性。添加fallbackToSystemLocale = false并删除localeResolver中的默认语言环境现在语言环境在请求中解析为“es”。

到目前为止一切顺利。可悲的是,通过“?lang = en”参数更改语言环境的部分不起作用,但这是另一个故事。

决议:

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages" />
    <property name="defaultEncoding" value="UTF-8"/>
    <property name="cacheSeconds" value="2" />
    <property name="fallbackToSystemLocale" value="false" />
</bean>

<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="lang" />
</bean>

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />

LocaleContextHolder.getLocale();

答案 2 :(得分:0)

消息代码使用RequestContext来检索MessageSource和当前Locale。这可以在MessageTag类的resolveMessage方法中看到:

return messageSource.getMessage(this.message, getRequestContext().getLocale());

请参阅:https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/MessageTag.java