localeChangeInterceptor不起作用

时间:2013-09-04 06:29:39

标签: java spring localization

我有非常标准的配置,我一直编辑很多次,在SO上检查了其他问题但是通过我的最终配置,大多数人都解决了他们的问题,但对我没有任何结果。每当发出如下命令:

http://localhost:8080/appName/?lang=es_MX

http://localhost:8080/appName?lang=es_MX它无法解析正确的区域设置,它什么都不做。

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="/WEB-INF/messages" />
    </bean>


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


     <mvc:interceptors>
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
            <property name="paramName" value="lang" />
        </bean>
    </mvc:interceptors>

我知道标头的默认语言环境解析器是可行的,所以我的messageResource和.jsp配置是正确的,因为我明确地设置了一个浏览器以具有es_MX语言环境,并且它正确地使用AcceptHeaderLocaleResolver解析。

是否与定义处理程序映射的方式有关?

@RequestMapping(value = "/", method = RequestMethod.GET)
public String home( Model model, Locale locale, HttpServletRequest hr) {

    String header = hr.getHeader("User-Agent");
    model.addAttribute("header", header);
    String contextPath = hr.getContextPath();
    model.addAttribute("contextPath", contextPath);

    return "index";
}

上帝我花了这么多时间......请帮助

2 个答案:

答案 0 :(得分:3)

我通过将拦截器放入servlet-context.xml而不是我的其他配置来解决它。现在试图弄清楚为什么在servlet-context.xml中它起作用,而在我的专用配置中却没有,你的见解会很有价值! :-) 我不接受我的答案,因为它没有解释原因。请解释一下为什么会出现这种情况(所以我可以测试它 - 理想情况下导致拦截器被放置在我的自定义配置中)。

对于遇到麻烦的人,请尝试以下方法:

<interceptors>
        <beans:bean
            class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"
            p:paramName="lang" />
</interceptors>

在servlet-context.xml中

需要名称空间:

 xmlns:p="http://www.springframework.org/schema/p" 

SessionLocaleResolver似乎不关心位置,也适用于我的自定义配置位置。

答案 1 :(得分:0)

检查API文档 - &gt; http://static.springsource.org/spring/docs/3.2.4.RELEASE/javadoc-api/org/springframework/web/servlet/i18n/SessionLocaleResolver.html

还是SessionLocaleResolver的resolveLocale方法的来源:

public Locale resolveLocale(HttpServletRequest request) {
    Locale locale = (Locale) WebUtils.getSessionAttribute(request, LOCALE_SESSION_ATTRIBUTE_NAME);
    if (locale == null) {
        locale = determineDefaultLocale(request);
    }
    return locale;
}

它将从请求中获取Locale:

protected Locale determineDefaultLocale(HttpServletRequest request) {
    Locale defaultLocale = getDefaultLocale();
    if (defaultLocale == null) {
        defaultLocale = request.getLocale();
    }
    return defaultLocale;
}

在ServletRequest.getLocale方法的文档中:

  

返回客户端将接受内容的首选语言环境,   基于Accept-Language标头。如果客户端请求没有   提供Accept-Language标头,此方法返回默认值   服务器的语言环境。返回:客户端的首选语言环境

似乎您需要通过更新正确的会话属性来更改区域设置,这是LocaleChangeInterceptor的工作。

然后拦截器可能出现问题。它是否将语言环境设置为正确的LocaleResolver?你能发布整个弹簧配置吗? mvc名称空间是否正确?

这里有一个完整的i18n教程 - &gt; http://www.mkyong.com/spring-mvc/spring-mvc-internationalization-example/

相关问题