无法解析区域设置

时间:2014-06-02 13:59:49

标签: spring jsp spring-mvc locale

我遇到了Locale的问题。我试着做一件简单的事情,我可以选择英语或德语。 所以我有两个名为的属性文件        messages_en和        messages_de。 到目前为止,这些文件只有一行:

        contactbook = Contact Book 

        contactbook = Adressbuch

分别。

现在在我的JSP视图中我有这个:

        <spring:message code="contactbook"/>

我们的想法是视图中的消息会根据我们正在使用的区域设置而改变。现在应该使用以下行更改语言环境:

    <a href="?language=en">English</a>|<a href="?language=de">German</a>

如果我删除一切都很好,但当然它不是指定的语言环境。所以其余观点都很好。

在我的dispatcher-servlet.xml文件中,我有:

                      

<bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <property name="defaultLocale" value="en" />
</bean>

<bean id="localeChangeInterceptor"
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="language" />
</bean>

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
    <property name="interceptors">
       <list>
        <ref bean="localeChangeInterceptor" />
       </list>
    </property>
</bean>

同样,没有它,一切都运作良好。我的理解在这里有些不对劲。 localeChangeInterceptor停止对语言环境所做的任何更改,而ControllerClassNameHandlerMapping会做什么?我继续看着我的控制器,想知道我应该添加一些东西,但在我看来,调度员中的所有这些线应该足够了。

我得到的例外是

 No message found under code 'contactbook' for locale 'en'

尽管有无数的例子我仍然没有理解或解决问题。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您需要配置ReloadableResourceBundleMessageSource。 看看java doc Here

实施例

     <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
                    <!--classpath of your messages-->
                <property name="basename" value="classpath:/i18n/messages" />
                <property name="useCodeAsDefaultMessage" value="true" />
                <property name="defaultEncoding" value="UTF-8" />
    </bean>

答案 1 :(得分:0)

如果您需要JavaConfig SpringMVC应用程序的工作示例,我可以帮助您使用我的代码。我一直在开发相同类型的简单应用程序。这是SpringMVC的配置:

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {

@Bean(name = "viewResolver")
public InternalResourceViewResolver getViewResolver(){
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setViewClass(JstlView.class);
    resolver.setPrefix("/views/");
    resolver.setSuffix(".jsp");
    resolver.setContentType("text/html; charset=UTF-8");

    return resolver;
}

@Bean(name = "messageSource")
public ReloadableResourceBundleMessageSource getReloadableResourceBundle(){
    ReloadableResourceBundleMessageSource resourceBundle = new ReloadableResourceBundleMessageSource();
    resourceBundle.setBasename("classpath:messages");
    resourceBundle.setDefaultEncoding("UTF-8");

    return resourceBundle;
}

@Bean(name = "localeResolver")
public SessionLocaleResolver getSessionLocaleResolver(){
    SessionLocaleResolver resolver = new SessionLocaleResolver();
    resolver.setDefaultLocale(Locale.ENGLISH);

    return resolver;
}

@Bean(name = "localeChangeInterceptor")
public LocaleChangeInterceptor getLocaleChangeInterceptor(){
    LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
    interceptor.setParamName("language");

    return interceptor;
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/css*").addResourceLocations("/resources/css/");
}

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(getLocaleChangeInterceptor());
}
}

此外,如果它无法解决您的问题并且您的配置工作正常,请尝试在消息包中的每个.message文件中的第一条消息之前放置行spacer。 (当我得到同样的例外情况时,它帮了我一次,我不知道为什么,只是说; P)