在我目前的项目中,我们需要为短信员实施一种方法,通过上传属性文件来管理wicket消息/国际化。
另请参阅此问题:Administrating internationalized wicket applications
正如那里所建议的,我已经实现了一个自定义IStringResourceLoader
并将其添加到StringResourceLoader列表的开头,以覆盖已经存在的任何属性:
getResourceSettings().getStringResourceLoaders().add(0, new CustomStringResourceLoader());
但这还不够,因为更新可能会发生,需要在运行时加载。 StringResources由wicket缓存,仅在触发ResourceWatcher
时更新。
我发现Wicket将字符串资源添加到观察者的位置:设置中的PropertiesFactory
。向观察者添加资源的方法是addToWatcher(...)
。然而,这种方法受到保护,整个设置也表明这用于开发目的,而不是用于生产。
我设法通过扩展PropertiesFactory
并有效创建自定义版本来添加到设置中来使用此方法:
getResourceSettings().setPropertiesFactory(new CustomPropertiesFactory(getResourceSettings()));
getResourceSettings().setResourcePollFrequency(Duration.seconds(1));
所以我的问题是:我觉得这是一个非常迂回的解决方案。还有另一种方法可以监视更改属性文件吗?
答案 0 :(得分:0)
我对问题的解决方案:
getResourceSettings().getStringResourceLoaders().add(0, new CustomResourceLoader());
getResourceSettings().getResourceFinders().add(new Path("/pathToResources"));
getResourceSettings().setResourcePollFrequency(Duration.seconds(1));
这会在列表的开头插入我的CustomResourceLoader
,以便首先检查所有属性。
添加的Path
告诉PropertiesFactory
在wicket之外的给定任意目录中查找资源。
我也需要资源文件的自定义名称,我在CustomResourceLoader
:
public String loadStringResource(final Class<?> clazz, final String key, final Locale locale, final String style, final String variation) {
final String myResourceFilename = createCustomResourceFileName(locale);
final IPropertiesFactory pF = Application.get().getResourceSettings().getPropertiesFactory();
final org.apache.wicket.resource.Properties props = pF.load(clazz, myResourceFilename);
...
}
使用PropertiesFactory
加载文件时,会自动将其添加到内部IModificationWatcher
。
事实证明,部分问题是资源文件采用非标准编码。这可以通过在设置中为IPropertyLoader
添加特殊PropertiesFactory
来解决:
((PropertiesFactory) getResourceSettings().getPropertiesFactory()).getPropertiesLoaders().add(0,
new UtfPropertiesFilePropertiesLoader("properties", "your-favorite-encoding"));