2

我正在尝试将 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 支持的教程进行比较。我看到只有一个区别: bean 定义CookieLocaleResolverReloadableResourceBundleMessageSource具有 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>

现在它运作良好!

是否需要在其定义中包含 id ReloadableResourceBundleMessageSourceCookieLocaleResolver

为什么InternalResourceViewResolver不需要身份证?

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

4

1 回答 1

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(因此您的自定义LocaleResover 被忽略),spring 将使用默认值。

更新

在 messageSource 的情况下,

“加载 ApplicationContext 时,它会自动搜索上下文中定义的 MessageSource bean。该 bean 必须具有名称 messageSource。如果找到这样的 bean,则对前面方法的所有调用都委托给消息源。如果没有消息找到源时,ApplicationContext 尝试查找包含同名 bean 的父级。如果找到,则使用该 bean 作为 MessageSource。如果 ApplicationContext 找不到任何消息源,则实例化一个空的 DelegatingMessageSource 以便能够接受对上述方法的调用。”

引用自春季文档。

于 2013-07-29T04:00:35.323 回答