Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SpringMVC中定义MessageSource和LocalResolver bean以添加i18n支持_Spring_Spring Mvc_Internationalization - Fatal编程技术网

在SpringMVC中定义MessageSource和LocalResolver bean以添加i18n支持

在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

我正在尝试向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">
    <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 + "]");
        }
    }
}