在SpringMVC中定义MessageSource和LocalResolver bean以添加i18n支持
我正在尝试向SpringMVC项目(3.2.0.RELEASE)添加i18n支持。我在/src/main/resources/bundle下面有两个包:在SpringMVC中定义MessageSource和LocalResolver bean以添加i18n支持,spring,spring-mvc,internationalization,Spring,Spring Mvc,Internationalization,我正在尝试向SpringMVC项目(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"> <prop
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>
我花了很多时间与添加i18n支持的教程进行比较。我发现只有一个区别:CookieLocaleResolver
和ReloadableResourceBundleMessageSource
的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>
现在它工作得很好
ReloadableResourceBundleMessageSource
和CookieLocaleResolver
是否要求在其定义中包含ID
为什么InternalResourceViewResolver
不需要id
不知是否有人能给我一个详细的解释。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将使用默认值(因此您的自定义localeResolver将被忽略)
更新
在messageSource的情况下
加载ApplicationContext时,它会自动
搜索上下文中定义的MessageSource bean。
bean的名称必须为messageSource
对上述方法的调用被委派给消息源。如果
未找到消息源,ApplicationContext尝试查找消息源
包含同名bean的父项。如果是,则使用该bean
如果ApplicationContext找不到任何
source对于消息,将实例化一个空的DelegatingMessageSource
以便能够接受对上面定义的方法的调用。”
从spring文档中引用。messageSource的计数相同。Spring按名称获取它。
messageSource
在AbstractApplicationContext.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 + "]");
}
}
}