Spring 3.1 ReloadableResourceBundleMessageSource和Apache Tiles 2.2.2

时间:2012-08-08 21:56:32

标签: spring-mvc internationalization jstl servlet-3.0 tiles2

似乎是一项简单的任务,结果却是几个小时的痛苦。 我在没有web.xml文件的JavaEE 6和Servlet 3.0.1 api上构建Spring 3.1 MVC应用程序。我有一个 WebMvcConfiguration 类,就像这个片段一样:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "be.collectortools.collectorsite")
public class MvcConfig extends WebMvcConfigurationSupport {

@Bean
    public ReloadableResourceBundleMessageSource messageSourceBean() {
        String[] basenames = {"classpath:messages"};

        ReloadableResourceBundleMessageSource resourceBundle = new ReloadableResourceBundleMessageSource();
        resourceBundle.setBasenames(basenames);
        resourceBundle.setDefaultEncoding("UTF-8");
        return resourceBundle;
    }
}

我已成功设置Apache Tiles 2.2.2和2个基本控制器。 现在我想将ResourceBundles添加到正在运行的Spring / Tiles应用程序中,我无法让它们工作。

搜索后我发现了一些可能出错的地方:

  • 我是否使用 fmt:message key =“application.header”或者我应该在JSP页面中使用 spring:message code =“application.header”吗?第一个忽略未找到的值,第二个抛出错误。
  • 我使用 ReloadableResourceBundleMessageSource 应该是“更好”或至少更新,然后 ResourceBundleMessageSource 这样可以吗?
  • ReloadableResourceBundleMessageSource 从更多位置加载文件,因此我指定了 classpath:
  • 我将messages.properties文件放在src / main / resources文件夹中
  • 在没有将语言环境添加到包名称的末尾时,是否仍然可以将其用作(默认)回退?无论哪种方式添加“en_US”语言环境都无济于事。

错误

root cause

javax.servlet.jsp.JspTagException: No message found under code 'application.header' for locale 'en_US'.
    org.springframework.web.servlet.tags.MessageTag.doStartTagInternal(MessageTag.java:184)

war文件也没有在Eclipse中运行我将它手动部署到我的本地tomcat 7.0.23。这也使我能够更轻松地查看部署的文件结构,并为我提供更好的控制。

我不知道我做错了什么,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

MessageSource bean必须命名为messageSource而不是messageSourceBean - 如果将@Bean更改为以下内容,它应该正确解析消息:

@Bean
public ReloadableResourceBundleMessageSource messageSource() {
    String[] basenames = {"classpath:messages"};

    ReloadableResourceBundleMessageSource resourceBundle = new ReloadableResourceBundleMessageSource();
    resourceBundle.setBasenames(basenames);
    resourceBundle.setDefaultEncoding("UTF-8");
    return resourceBundle;
}