代码之家  ›  专栏  ›  技术社区  ›  David Waters

如何重写PropertyResourceBundle中的某些资源

  •  4
  • David Waters  · 技术社区  · 16 年前

    我有一个现存的Java/JSF网站,屏幕上的所有文本都是从属性文件中通过.lt;f:Load BaseBaseNe= =“org .Simult.Apple”,Va=“Apple Lead”/gt,它从Apple Loop.Form中提取文本。

    对于这些可在运行时配置的子集,我希望从其他位置(通过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
    }
    }
    

    我尝试过此操作,但父级为空,我认为这更适用于默认情况--gt;en->en_GB。

    我正在考虑让属性文件与自定义ResourceBundle具有不同的名称,然后从customResourceBundle.handleGetObject(key)中委托整个ResourceBundle.getBundle(property_file_name).getString(key)的选项,这不是很吸引人。

    有更好的主意吗?

    2 回复  |  直到 16 年前
        1
  •  2
  •   David Waters    16 年前

    最后我通过检查是否有覆盖值来解决这个问题,如果我们返回了覆盖值,那么就委托给标准资源包。

    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,这是所有客户机将使用的文件是uilabels file,因此resourcebundle加载程序不会递归。

        2
  •  0
  •   user7094    16 年前

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

    例如,您可以定义一个名为 messageSource 然后加载application.properties,再加上CMS属性或其他属性。

    然后写一个自定义 PropertyResolver (下面是一个如何使用Spring的messagesource执行此操作的示例 here )并将其链接到 faces-config.xml 使用类似的方法:

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