为什么Thymeleaf International仅适用于ResourceBundleMessageSource

时间:2016-04-23 20:51:40

标签: java spring thymeleaf

所以帮助回答这个问题Thymeleaf + Spring (not Boot) - how to show messages from messageSource

我发现,如果您使用ReloadableResourceBundleMessageSource,它就无法运作。 Thymeleaf会显示?? app.name_pt_BR ??而不是预期的结果。

@Bean(name = "messageSource")
public MessageSource messageSource() {

    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("/i18n/messages");
    messageSource.setFallbackToSystemLocale(false);
    messageSource.setCacheSeconds(0);
    messageSource.setDefaultEncoding("UTF-8");

    return messageSource;
}

当我切换到下面时,它按预期工作。

@Bean(name = "messageSource")
public MessageSource messageSource() {

    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("/i18n/messages");
    messageSource.setFallbackToSystemLocale(false);
    messageSource.setCacheSeconds(0);
    messageSource.setDefaultEncoding("UTF-8");

    return messageSource;
}

为什么无法使用ReloadableResourceBundleMessageSource?

为此问题添加代码:GitHub

2 个答案:

答案 0 :(得分:1)

找到了答案!

根据ReloadableResouceBundleMessageSource

的javadoc

Spring特定的MessageSource实现,它使用指定的基本名称访问资源包,参与Spring ApplicationContext的资源加载。 与基于JDK的ResourceBundleMessageSource相比,此类使用Properties实例作为消息的自定义数据结构,通过Spring Resource句柄中的PropertiesPersister策略加载它们。此策略不仅能够根据时间戳更改重新加载文件,还能够加载具有特定字符编码的属性文件。它也会检测XML属性文件。

请注意,基本名称设置为" basenames"财产的处理方式略微不同于" basenames" ResourceBundleMessageSource的属性。它遵循基本的ResourceBundle规则,即不指定文件扩展名或语言代码,但可以引用任何Spring资源位置(而不是仅限于类路径资源)。使用"类路径:"前缀,资源仍然可以从类路径加载,但是" cacheSeconds" " -1"以外的值(在这种情况下,永远缓存)可能无法可靠地工作。

对于典型的Web应用程序,可以将消息文件放入WEB-INF:例如a" WEB-INF / messages" basename会使" WEB-INF / messages.properties"," WEB-INF / messages_en.properties"等安排以及" WEB-INF / messages.xml"," WEB-INF / messages_en.xml"请注意,由于顺序查找,先前资源包中的消息定义将覆盖后一个包中的消息定义。

这个MessageSource可以很容易地在ApplicationContext之外使用:它将使用DefaultResourceLoader作为默认值,如果在上下文中运行,只需用ApplicationContext的资源加载器覆盖。它没有任何其他特定依赖项。

所以修复就是提供路径。

@Bean
public MessageSource messageSource()
{
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("messages");
    messageSource.setFallbackToSystemLocale(false);
    messageSource.setCacheSeconds(0);
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

setBasename()

上包含路径
@Bean
public MessageSource messageSource()
{
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:messages");
    messageSource.setFallbackToSystemLocale(false);
    messageSource.setCacheSeconds(0);
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

答案 1 :(得分:0)

您只需要将templateEngine定义为@Bean。

@Bean
public SpringTemplateEngine templateEngine(){