【问题标题】:Defining MessageSource and LocaleResolver beans in Spring MVC for adding i18n support在 Spring MVC 中定义 MessageSource 和 LocaleResolver bean 以添加 i18n 支持
【发布时间】:2013-07-28 15:04:59
【问题描述】:

我正在尝试将 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?

想知道谁能给我详细的解释。

【问题讨论】:

    标签: spring spring-mvc internationalization


    【解决方案1】:

    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。如果找到这样的 bean,所有 对上述方法的调用被委托给消息源。如果 未找到消息源,ApplicationContext 尝试查找 包含同名 bean 的父级。如果是这样,它会使用它 bean 作为 MessageSource。如果 ApplicationContext 找不到任何 消息源,实例化一个空的 DelegatingMessageSource 为了能够接受对上面定义的方法的调用。”

    引用自春季文档。

    【讨论】:

    • messageSource 也一样。 Spring 按名称获取它。
    • messageSourceAbstractApplicationContext.java 中初始化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2016-01-11
    相关资源
    最近更新 更多