【问题标题】:Spring 3.1 ReloadableResourceBundleMessageSource and Apache Tiles 2.2.2Spring 3.1 ReloadableResourceBundleMessageSource 和 Apache Tiles 2.2.2
【发布时间】:2012-08-08 21:56:31
【问题描述】:

看似简单的任务却变成了几个小时的痛苦。 我在没有 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 应用程序中,但我无法让它们工作。

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

  • 我应该在我的 JSP 页面中使用 fmt:message key="application.header" 还是应该使用 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。这也让我可以更轻松地查看已部署的文件结构并更好地控制。

我不知道我做错了什么,任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案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;
    }
    

    【讨论】:

    • 我不知道该方法的名称实际上会有所不同。我今晚会检查这个。这不适用于其他方法,例如。视图解析器所以我没有检查这个。
    • 感谢您指出这个简单的细节!我只是徘徊为什么它在这里有所作为,但不是为了例如。瓦片视图解析器Bean。我稍后会研究它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 2013-10-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2010-09-24
    相关资源
    最近更新 更多