在Spring MVC中定义MessageSource和LocaleResolver Bean以添加i18n支持
问题内容:
我正在尝试向Spring MVC项目(3.2.0.RELEASE)添加i18n支持。我在/ 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定义CookieLocaleResolver
和ReloadableResourceBundleMessageSource
具有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>
现在运作良好!
不要ReloadableResourceBundleMessageSource
和CookieLocaleResolver
要求,以在其定义的id?
为什么InternalResourceViewResolver
不需要身份证?
想知道是否有人可以给我详细解释。
问题答案:
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,则对先前方法的所有调用都将委派给消息源。如果没有消息,找到source时,ApplicationContext会尝试查找包含同名bean的父对象;如果这样做,它将使用该bean作为MessageSource;如果ApplicationContext无法找到消息的任何源,则实例化一个空的DelegatingMessageSource以便将其作为消息源。能够接受对上述方法的调用。”
摘自Spring Doc。