小编典典

如何从PropertyResourceBundle覆盖某些资源

java

我有一个现有的Java / JSF网站,屏幕上的所有文本都是通过来自属性文件的,该文本将从applicaltion.properties中提取。

对于这些的运行时可配置子集,我想从其他位置(通过Web服务进行CMS)中提取字符串。看一下ResourceBundle类,大概有一个基础设施,可以委派给父ResourceBundle。

我想要这样的东西

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
}
}

我已经尝试过了,parent是空的,我认为这在默认-> en-> en_GB的情况下更有用。

我正在考虑将属性文件的名称与自定义resourceBundle的名称不同,然后委托CustomResourceBundle.handleGetObject(key)中的整个ResourceBundle.getBundle(PROPERTY_FILE_NAME).getString(key)委派的属性文件不是很吸引人。

还有更好的主意吗?


阅读 217

收藏
2020-11-19

共1个答案

小编典典

我最终通过检查是否有覆盖值,是否确实返回了覆盖值来解决了这个问题,否则委托了标准资源包

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加载程序不会递归。

2020-11-19