2

在我当前的项目中,我们需要实现一种方式,让短信发送者通过上传属性文件来管理检票口消息/国际化。

另请参阅此问题:管理国际化检票口应用程序

正如那里所建议的那样,我已经实现了一个自定义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));

所以我的问题是:我觉得这是一个非常迂回的解决方案。是否有另一种方法来监视更改的属性文件?

4

1 回答 1

0

我对问题的解决方案:

getResourceSettings().getStringResourceLoaders().add(0, new CustomResourceLoader());
getResourceSettings().getResourceFinders().add(new Path("/pathToResources"));
getResourceSettings().setResourcePollFrequency(Duration.seconds(1));

这会将 my 插入CustomResourceLoader列表的开头,因此首先在那里检查所有属性。

添加Path的内容告诉PropertiesFactorywicket 在给定的任意目录中查找资源。

我的资源文件也需要自定义名称,我在以下代码中意识到了这一点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"));
于 2013-10-09T14:50:41.337 回答