所以帮助回答这个问题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
答案 0 :(得分:1)
找到了答案!
根据ReloadableResouceBundleMessageSource
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(){