我有一个现有的
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加载器不会递归.