我有一个现有的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)委派的属性文件不是很吸引人。
还有更好的主意吗?
我最终通过检查是否有覆盖值,是否确实返回了覆盖值来解决了这个问题,否则委托了标准资源包
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加载程序不会递归。