【发布时间】: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