2013-07-28 77 views
2

我試圖給Spring MVC項目(3.2.0.RELEASE)添加i18n支持。我具有低於/ SRC /主/資源/束兩束:在Spring MVC中定義MessageSource和LocaleResolver bean以添加i18n支持

messageBundle_en.properties 
messageBundle_vi.properties 

而對於如下彈簧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) 

我花了很多時間與教程添加國際化支持相比。我看到只有一個區別: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?

想知道是否有人可以給我一個詳細的解釋。

回答

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將使用默認值。

UPDATE

在爲messageSource情況下,

「當一個ApplicationContext被加載時,它會自動 搜索在上下文中定義爲MessageSource豆。的 bean必須有名稱爲messageSource。如果找到這樣的bean,則將所有調用上述方法的 委託給消息源。如果 沒有找到消息源,則ApplicationContext將嘗試查找 包含具有相同名稱的bean的父代。如果確實如此,它將使用該Bean作爲MessageSource。如果ApplicationContext中找不到任何 源的消息,空DelegatingMessageSource是爲了能夠接受上述方法的調用實例化 。」

從春天文檔引用。

+1

同樣計數messageSource。Spring按名稱獲取它 –

+0

@MartinFrey感謝Martin,更新messageSource的答案 – Hippoom

+0

'messageSource'在'AbstractApplicationContext.java'中初始化, –