【问题标题】:Loading ResourceBundle object in Spring在 Spring 中加载 ResourceBundle 对象
【发布时间】:2012-01-10 23:17:39
【问题描述】:

我需要将 Spring Web 应用程序的 i18n 本地化属性作为 ResourceBundle 对象加载到在 JBoss AS7 上运行的已部署 WAR 的上下文中。

这里的原因是我需要将 ResourceBundle 对象作为参数提供给 JasperReports 以正确编译报告。 JasperReports 使用参数“REPORT_RESOURCE_BUNDLE”通过 str() 函数或 $R{} 表达式绑定处理报告中的国际化。此参数唯一接受的类型是 ResourceBundle 对象,这就是我的情况。

我在某个时候让它工作了,但似乎 JBoss 保留了一个陈旧版本的属性,我相信这可以通过以下事实得到澄清,打包并重新部署在项目上。

在 Spring 中,我们配置了如下 MessageSource Bean,它能够成功加载属性文件并将其用作资源包:

@Bean 
public MessageSource messageSource() {
  ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
  String[] basenames = {"/WEB-INF/classes/messages/i18n/core_messages",
                        "/WEB-INF/classes/messages/i18n/mui_messages"};
  ms.setBasenames(basenames);
  return ms;
}

我目前获取 ResourceBundle 对象的实现如下:

public ResourceBundle getBeanResourceBundle() {
  Locale fromConfig = DEFAULT_LOCALE;

  //Resolve Locale from a configuration service

  ClassLoader cl = Thread.currentThread().getContextClassLoader();
  return ResourceBundle.getBundle("core_messages", fromConfig, cl);
}

使用 this.getClassLoader() 加载类时出现问题,然后在我更改为从 Thread.currentThread() 加载后开始工作。然而现在 clean:package:deploy 已经使这个无效,我有合理的信息向我建议它实际上停止加载新的“core_messages”ResourceBundle 对象,因为在部署的应用程序中明显的键值更改从未出现过变化。

部署的结构是通过maven构建的,如下:

核心模块打包为 JAR,它是前端模块的依赖项,这些模块打包为 JBoss 部署的 WAR。

在上述方法中具有加载资源包之类的服务的代码位于核心模块中。最终的 WAR 是尝试从其 WEB-INF/classes/.. 类路径解析文件的前端模块之一。

我需要访问什么类加载器才能从适当的类路径加载?

【问题讨论】:

    标签: java spring jboss jasper-reports resourcebundle


    【解决方案1】:

    Spring 中的 MessageSourceResourceBundle 类是 ResourceBundle 的实现,它使用 MessageSource 来提供其属性。它可以用 MessageSource 对象(Autowired)和 Locale 来实例化。 MessageSource 已经处理了我在应用程序中需要的内容,我只需要获取一个可用的 ResourceBundle,它与 Locale 一样。

    public ResourceBundle getBeanResourceBundle() {
      Locale fromConfig = DEFAULT_LOCALE;
    
      //Resolve Locale from a configuration service
    
      return new MessageSourceResourceBundle(ms, fromNodeConfig); //replace code in my question
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 2011-07-18
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多