在Spring MVC中定义MessageSource和LocaleResolver bean以添加i18n支持

时间:2013-07-28 15:05:00

标签: spring spring-mvc internationalization

我正在尝试将i18n支持添加到Spring MVC项目(3.2.0.RELEASE)。我在/ src / main / resources / bundle下面有两个包:

messageBundle_en.properties
messageBundle_vi.properties

以下是spring mvc的配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="cache" value="false" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

<bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:bundle/messageBundle" />
</bean>
<bean class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="vi" />
</bean>
<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang" />
    </bean>
</mvc:interceptors>

使用上述配置,应用程序无法正常工作。错误是

org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspTagException: No message found under code 'message.home.header.welcome' for locale 'en_US'.
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)

与添加i18n支持的教程相比,我花了很多时间。我看到只有一个区别:CookieLocaleResolverReloadableResourceBundleMessageSource的bean定义具有id属性。所以我将配置更改为

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:bundle/messageBundle" />
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="vi" />
</bean>

现在它运作良好!

ReloadableResourceBundleMessageSourceCookieLocaleResolver是否要求在其定义中包含ID?

为什么InternalResourceViewResolver不需要ID?

想知道是否有人可以详细解释我。

1 个答案:

答案 0 :(得分:3)

DispatcherServlet.java

public static final String LOCALE_RESOLVER_BEAN_NAME = "localeResolver";

private void initLocaleResolver(ApplicationContext context) {
    try {
        this.localeResolver = context.getBean(LOCALE_RESOLVER_BEAN_NAME, LocaleResolver.class);
        if (logger.isDebugEnabled()) {
            logger.debug("Using LocaleResolver [" + this.localeResolver + "]");
        }
    }
    catch (NoSuchBeanDefinitionException ex) {
        // We need to use the default.
        this.localeResolver = getDefaultStrategy(context, LocaleResolver.class);
        if (logger.isDebugEnabled()) {
            logger.debug("Unable to locate LocaleResolver with name '" + LOCALE_RESOLVER_BEAN_NAME +
                    "': using default [" + this.localeResolver + "]");
        }
    }
}

Spring使用一些传统的bean名称来初始化DispatcherServlet。

在您的情况下,如果找不到名为“localeResolver”的bean,则spring将使用默认值(因此忽略您的自定义LocaleResover)。

更新

在messageSource案例中,

  

“加载ApplicationContext时,会自动加载   搜索在上下文中定义的MessageSource bean。的的   bean必须具有名称messageSource 。如果找到这样的豆,那就全部了   对前面方法的调用被委托给消息源。如果   没有找到消息源,ApplicationContext尝试查找   包含具有相同名称的bean的父级。如果是的话,就会使用它   bean作为MessageSource。如果ApplicationContext找不到任何   消息源,实例化一个空的DelegatingMessageSource   为了能够接受对上面定义的方法的调用。“

引自春季医生。