gpt4 book ai didi

spring - 使用通配符的 ReloadableResourceBundleMessageSource

转载 作者:行者123 更新时间:2023-12-02 21:35:58 24 4
gpt4 key购买 nike

经过一些测试,看起来ReloadableResourceBundleMessageSource不支持通配符

假设捆绑文件位于资源中,并具有以下名称:messages.properties、messages_fr.properties 等。

这个基本名称有效:

setBasename("classpath:/messages");

这个没有

setBasename("classpath*:/messages*");

那么,我该如何加载与给定模式匹配的每个属性文件呢?

备注:我需要使用 ReloadableResourceBundleMessageSource 的实现,因为我想在 REST 级别公开给定语言环境的每个属性...以便可以由客户端上的 Angular 翻译使用,如 here 所解释的那样.

一些想法?非常感谢。

最佳答案

正如对此的解释 post ,可以重写ReloadableResourceBundleMessageSource的refreshProperties方法以允许从类路径加载多个资源并对应于给定的模式

让我们举一个使用 Spring boot defaults 大部分内容的具体示例。 :

public class BaseReloadableResourceBundleMessageSource extends ReloadableResourceBundleMessageSource
implements InitializingBean {

private static final String PROPERTIES_SUFFIX = ".properties";

private final PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

private final Charset encoding = Charset.forName("UTF-8");

@Autowired
private Environment environment;

/**
* Returns the resource bundle corresponding to the given locale.
*/
public Properties getResourceBundle(Locale locale) {
clearCacheIncludingAncestors();
return getMergedProperties(locale).getProperties();
}

@Override
public void afterPropertiesSet() {
setBasename("classpath*:/" + environment.getProperty("spring.messages.basename", "messages"));
setDefaultEncoding(environment.getProperty("spring.messages.encoding", encoding.name()));
setCacheSeconds(environment.getProperty("spring.messages.cache-seconds", int.class, -1));
setFallbackToSystemLocale(environment.getProperty("spring.messages.fallback-to-system-locale",
boolean.class, true));
}

@Override
protected PropertiesHolder refreshProperties(String filename, PropertiesHolder propHolder) {
final Properties properties = new Properties();
long lastModified = -1;
try {
for (Resource resource : resolver.getResources(filename + PROPERTIES_SUFFIX)) {
final PropertiesHolder holder = super.refreshProperties(cleanPath(resource), propHolder);
properties.putAll(holder.getProperties());
if (lastModified < resource.lastModified())
lastModified = resource.lastModified();
}
} catch (IOException ignored) {
// nothing to do
}
return new PropertiesHolder(properties, lastModified);
}

private String cleanPath(Resource resource) throws IOException {
return resource.getURI().toString().replace(PROPERTIES_SUFFIX, "");
}

}

关于spring - 使用通配符的 ReloadableResourceBundleMessageSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34724398/

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