4

我有一个现有的 Java/JSF 网站,屏幕上的所有文本都来自属性文件,通过 <f:loadBundle basename="org.example.applicaltion" var="applicaltion" /> 从 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) 的完整堆栈。

有更好的想法吗?

4

2 回答 2

2

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

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

于 2009-03-18T09:41:09.810 回答
0

您可以编写一个自定义的 PropertyResolver,然后让它执行从何处提取属性值的逻辑。

例如,您可以定义一个名为的 beanmessageSource并加载 application.properties,加上您的 CMS 属性或您拥有的任何东西。

然后编写一个自定义PropertyResolver(这里有一个如何使用 Spring 的 MessageSource 执行此操作的示例并将其链接到您的faces-config.xml使用如下所示的内容:

<application>  
<property-resolver>  
      com.package.MessageSourcePropertyResolver  
   </property-resolver>  
</application>   
于 2009-03-17T10:59:06.173 回答