如何在 ADF 12c 中重新加载列表资源包

Posted

技术标签:

【中文标题】如何在 ADF 12c 中重新加载列表资源包【英文标题】:How to reload list resource bundle in ADF 12c 【发布时间】:2017-09-26 22:35:52 【问题描述】:

我未能重新加载我的资源包类以在页面上反映更改的翻译(使我的最终用户)。尽管 getContent 方法执行并且所有翻译作为从数据库获取的键/值和从 getContent 方法成功返回的 object[][]。每次我通过 actionListener 清除缓存并刷新 jsf 页面后都会发生这种情况。

ResourceBundle.clearCache();

我也尝试使用以下内容并得到相同的结果。

ResourceBundle.clearCache(Thread.currentThread().GetContextClassLoader());

为什么 WLS 总是看到旧的?我错过了什么吗?

版本:12.2.1.1.0 和 12.2.1.3.0

【问题讨论】:

【参考方案1】:

最终用户 - 在完成翻译并为项目的国际化做出贡献后,翻译被保存到数据库中, 执行这些操作的过程通过以下步骤完成:

    创建一个 HashMap 并加载映射中的所有资源键/值对 来自数据库:

    while (rs.next())       
        bundle.put(rs.getString(1), rs.getString(2));       
                
    

    刷新应用程序的 Bundle

    SoftCache cache =
                (SoftCache)getFieldFromClass(ResourceBundle.class,
                                             "cacheList");
    synchronized (cache) 
            ArrayList myBundles = new ArrayList();
    
            Iterator keyIter = cache.keySet().iterator();
            while (keyIter.hasNext()) 
                Object key = keyIter.next();
                String name =
                    (String)getFieldFromObject(key, "searchName");
    
                if (name.startsWith(bundleName)) 
                    myBundles.add(key);
                    sLog.info("Resourcebundle " + name +
                              " will be refreshed.");
                
            
            cache.keySet().removeAll(myBundles);
    

    从您的应用程序的ResourceBoundle 获取字符串:

    for (String resourcebundle : bundleNames) 
            String bundleName =
            resourcebundle + (bundlePostfix == null ? "" : bundlePostfix);
            try 
                  bundle =  ResourceBundle.getBundle(bundleName, locale, getCurrentLoader(bundleName));
    
             catch (MissingResourceException e) 
                // bundle with this name not found;
            
    
            if (bundle == null)
                continue;
            try 
                message = bundle.getString(key);
                if (message != null)
                    break;
             catch (Exception e) 
        
     
    

【讨论】:

根据您的解决方案,我有两个用于翻译的容器。首先是资源包,其次是地图对象。这种加载两个对象的写入方式是否包含我的翻译?

以上是关于如何在 ADF 12c 中重新加载列表资源包的主要内容,如果未能解决你的问题,请参考以下文章

Oracle12c 安装

ADF12C部署在weblogic12.13上

如何在颤动中从列表中删除项目时重新加载列表

如何在线性时间内根据键重新组合列表列表?

如何安装oracle12c数据库实例

ADF12C Taskflow事物