gpt4 book ai didi

java - 为什么 Thymeleaf International 只能与 ResourceBundleMessageSource 配合使用

转载 作者:行者123 更新时间:2023-11-30 07:25:53 24 4
gpt4 key购买 nike

所以帮助回答这个问题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

最佳答案

找到答案了!

根据 ReloadableResouceBundleMessageSource 的 javadoc

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

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

对于典型的 Web 应用程序,消息文件可以放置在 WEB-INF 中:例如“WEB-INF/messages”基本名称将罚款“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;
}

关于java - 为什么 Thymeleaf International 只能与 ResourceBundleMessageSource 配合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36816274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com