【发布时间】:2012-04-12 18:47:34
【问题描述】:
背景:
我要求向用户显示的消息必须因语言和公司部门而异。因此,我不能使用开箱即用的资源包,所以我实际上是在使用 PropertiesConfiguration 文件编写我自己的资源包版本。
此外,我有一个要求,即消息必须在生产中动态修改而无需重新启动。
我正在加载三个不同的属性文件迭代:
-basename_division.properties
-basename_2CharLanguageCode.properties
-basename.properties
这些文件存在于类路径中。此代码将进入一个标签库,供 Portal 中的多个 portlet 使用。
我构建了可能的 .properties 文件,然后尝试通过以下方式加载每个文件:
PropertiesConfiguration configurationProperties;
try {
configurationProperties = new PropertiesConfiguration(propertyFileName);
configurationProperties.setReloadingStrategy(new FileChangedReloadingStrategy());
} catch (ConfigurationException e) {
/* This is ok -- it just means that the specific configuration file doesn't
exist right now, which will often be true. */
return(null);
}
如果它确实成功地找到了一个文件,它会将创建的 PropertiesConfiguration 保存到一个 hashmap 中以供重复使用,然后尝试找到 key。 (与常规资源包不同,如果找不到密钥,它会尝试查找更通用的文件以查看该文件中是否存在密钥 - 因此只需将覆盖异常放入语言/部门特定属性文件。)
问题:
如果文件在第一次检查时不存在,则会引发预期的异常。但是,如果稍后将文件放入类路径中并且然后重新运行此代码,则仍然会引发异常。重新启动门户显然可以解决问题,但这对我没有用 - 我需要能够允许他们将新消息放置在适当的位置,以便无需重新启动即可覆盖语言/公司部门。而且我对为所有可能的部门创建空白文件并不感兴趣,因为有很多部门。
我假设这是一个类加载器问题,因为它第一次确定该文件在类路径中不存在,并在尝试重新加载同一文件时缓存该结果。我对使用类加载器做任何太花哨的事情不感兴趣。 (我将是唯一能够理解/维护该代码的人。)具体环境是 WebSphere Portal。
有什么办法可以解决这个问题还是我被卡住了?
【问题讨论】:
标签: java apache-commons apache-commons-config