java - 在Spring中加载ResourceBundle对象

标签 java spring jboss jasper-reports resourcebundle

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

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

我让它在某个时候工作,但似乎 JBoss 保留了属性的陈旧版本,我相信这一点可以通过以下事实得到澄清:在我执行干净的操作后,它无法再使用未修改的代码来定位 ResourceBundle 、打包并重新部署到项目上。

在 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 对象许多部署回来,因为明显的键值更改在已部署的应用程序中似乎从未发生更改。/p>

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

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

具有加载诸如上述方法中的ResourceBundle之类的服务的代码位于Core模块中。最后的 WAR 是前端模块之一,它尝试解析其 WEB-INF/classes/.. 类路径中的文件。

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

最佳答案

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
}

关于java - 在Spring中加载ResourceBundle对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8811995/

相关文章:

java - 在 Android 的 LinearLayout 中覆盖 paddingLeft

java - java中的IP伪装

java - 两个进程驻留在不同的 AP 服务器并引用相同的 boolean 标志。 ( Spring , java )

java - Eclipse Jboss 工具 - 部署父子项目

java - 为什么 `test2()` 方法编译成功,但 `test1()` 方法编译失败?

java - OutOfMemory 时生成 java 转储

java - 使用 spring EL 获取 Spring 配置文件名称

Spring Data Jdbc - 将内部类映射到表列

hibernate - Spring框架从3.0.7升级到5.0.2

java - 为什么这个 java servlet 不起作用 [OpenShift+Tomact6+Git+Jboss]