java – 如何从PropertyResourceBundle覆盖一些资源

我有一个现有的
Java / JSF网站,屏幕上的所有文本都来自属性文件,通过< f:loadBundle basename =“org.example.applicaltion”var =“applicaltion”/>从applicaltion.properties中提取文本.

对于这些运行时可配置的子集,我想从其他位置(CMS通过Web服务)拉取字符串.查看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
}
}

我试过这个,父是空的,我认为这更多用于默认情况 – > en – > EN_GB.

我正在考虑一个不太吸引人的选项,即让属性文件与自定义resourceBundle具有不同的名称,然后从CustomResourceBundle.handleGetObject(key)中委托完整的ResourceBundle.getBundle(PROPERTY_FILE_NAME).getString(key)堆栈.

有更好的想法吗?

最佳答案 我最后通过检查是否有覆盖值来解决这个问题,如果我们确实返回了它,否则委托给标准资源包

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加载器不会递归.

点赞