gpt4 book ai didi

java - Spring MessageSource 是否支持多类路径?

转载 作者:IT老高 更新时间:2023-10-28 13:52:29 27 4
gpt4 key购买 nike

我正在使用 Spring 框架为我们的基于 Web 的应用程序设计一个插件系统。插件是类路径上的 jar。这样我就可以得到jsp之类的源码了,见下文

ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] pages = resolver.getResources("classpath*:jsp/*jsp");

到目前为止一切顺利。但我对 messageSource 有疑问。在我看来 ReloadableResourceBundleMessageSource#setBasename 不支持多个通过“classpath*:”的类路径如果我只使用“classpath:”,我只能从一个插件中获取messageSource。

有人知道如何从所有插件中注册 messageSources 吗?是否存在这样的 MessageSource 实现?

最佳答案

用@seralex-vi basenames/WEB-INF/messages 的解决方法没有起作用。

我重写了 ReloadableResourceBundleMessageSource 类的 refreshProperties 方法,该方法执行两种类型的基本名称(classpath*: 和/WEB-INF/)

public class SmReloadableResourceBundleMessageSource extends ReloadableResourceBundleMessageSource {

private static final String PROPERTIES_SUFFIX = ".properties";

private PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

@Override
protected PropertiesHolder refreshProperties(String filename, PropertiesHolder propHolder) {
if (filename.startsWith(PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX)) {
return refreshClassPathProperties(filename, propHolder);
} else {
return super.refreshProperties(filename, propHolder);
}
}

private PropertiesHolder refreshClassPathProperties(String filename, PropertiesHolder propHolder) {
Properties properties = new Properties();
long lastModified = -1;
try {
Resource[] resources = resolver.getResources(filename + PROPERTIES_SUFFIX);
for (Resource resource : resources) {
String sourcePath = resource.getURI().toString().replace(PROPERTIES_SUFFIX, "");
PropertiesHolder holder = super.refreshProperties(sourcePath, propHolder);
properties.putAll(holder.getProperties());
if (lastModified < resource.lastModified())
lastModified = resource.lastModified();
}
} catch (IOException ignored) {
}
return new PropertiesHolder(properties, lastModified);
}

在 spring-context.xml 你必须有 classpath*: 前缀

<bean id="messageSource" class="SmReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>/WEB-INF/i18n/enums</value>
<value>/WEB-INF/i18n/messages</value>
<value>classpath*:/META-INF/messages-common</value>
<value>classpath*:/META-INF/enums</value>
</list>
</property>
</bean>

关于java - Spring MessageSource 是否支持多类路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3888832/

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