如何从一个PropertyResourceBundle的覆盖某些资源
-
19-08-2019 - |
题
我有一个exsisting的Java / JSF网站所有屏幕上的文字是从属性文件通过未来的
有关的这些,我想从别的地方拉弦(通过Web服务CMS)运行时配置的子集。纵观ResourceBundle类它appares到有一个父资源包东西接近这个与代表团的infrastructer。
我想是这样somethis
public class Applicaltion extends ResourceBundle{
@Override
protected Object handleGetObject(String key) {
if(overridenKey(key)){
return overridedValue(key);
}
return null; // ResourceBundle.getObject will delegate to parent
// if we return null
}
}
我曾尝试这和父为空,我想这是更多地用于默认的情况下 - >烯 - > EN_GB
我正在考虑的有属性文件从自定义资源包一个不同的名称不是很吸引人的选择,然后通过从ResourceBundle.getBundle(PROPERTY_FILE_NAME).getString(密钥)的内CustomResourceBundle.handleGetObject完整的堆栈委托(钥匙)
任何更好的想法?
解决方案
我最终通过检查解决这个,如果我们有一个替代值,如果我们没有这回,否则委托给标准的资源束
public class UILabels extends ResourceBundle {
private ResourceBundle getFileResources(){
return ResourceBundle.getBundle("com.example.web.UILabelsFile", this.getLocale());
}
public Enumeration<String> getKeys() {
return getFileResources().getKeys();
}
protected Object handleGetObject(String key) {
if(overrideValue(key)){
return getOverridenValue(key);
}
return getFileResources().getObject(key);
}
}
请注意在类名是UILabels的微小差异而这正是所有客户端将使用的文件是UILabelsFile这样的ResourceBundle加载程序不会去递归。
其他提示
您可以写一个自定义PropertyResolver,然后有执行的,其中从其中提取的属性值的逻辑。
例如,你可以定义一个bean叫messageSource
和有负荷高达application.properties,再加上你的CMS属性或任何你。
然后编写一个自定义PropertyResolver
(有一个如何使用Spring的MessageSource的这里做一个这样的例子),并在使用这样的链接到您的faces-config.xml
:
<application>
<property-resolver>
com.package.MessageSourcePropertyResolver
</property-resolver>
</application>
不隶属于 StackOverflow