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

标签 java spring plugins classpath

我正在使用 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/

相关文章:

grails - Jasper iReport-在开发中创建报告并将其部署到生产中

java - 以原子方式运行两个操作

java - Spring 4 vs Jersey 用于 REST Web 服务

java - Android 中的回收器 View 无法点击

javascript - JQuery 在向服务器发送变量时添加逗号

javascript - Jquery Apprise 插件无法正常工作

java - windows 7,一些 SWT 对话框显示不完整

java - 为新项目选择 'better' 或更熟悉的技术?

java - 使用 Spring Boot 的 gRPC 和 REST 微服务

javascript - 如何使用 Bootstrap Tab Collapse 插件在标签内获取 h4 标签?