【问题标题】:How to override some Resources from a PropertyResourceBundle如何覆盖 PropertyResourceBundle 中的一些资源
【发布时间】:2009-03-17 10:33:17
【问题描述】:

我有一个现有的 Java/JSF 网站,屏幕上的所有文本都来自属性文件,通过 从应用程序中提取文本。属性。

对于这些的运行时可配置子集,我想从其他地方(通过 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 为 null,我认为这更多用于 default -> en -> en_GB 的情况。

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

有更好的想法吗?

【问题讨论】:

  • 我仍在寻找一个更好的答案,如果我在三月底之前没有得到更好的答案,我会接受我自己的答案。

标签: java resourcebundle


【解决方案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 加载器不会递归。

【讨论】:

    【解决方案2】:

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

    例如,您可以定义一个名为 messageSource 的 bean,然后加载 application.properties 以及您的 CMS 属性或您拥有的任何内容。

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

    <application>  
    <property-resolver>  
          com.package.MessageSourcePropertyResolver  
       </property-resolver>  
    </application>   
    

    【讨论】:

    • 感谢您的想法,但我更愿意修改通过 f:loadBundle 提供的现有资源加载,然后修改属性解析。我已经可以通过在问题中扩展 ResrouceBundle 来获得程序控制。
    猜你喜欢
    • 2015-10-09
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多