初始化托管的ApplicationScope Bean

时间:2014-08-05 16:03:54

标签: initialization xpages managed-bean

我创建了一个Managed Bean,它从视图中读取一系列文档,并为每个文档创建一个HashMap条目。每个哈希映射条目包含从文档中检索的一系列值。这些值很少更改并在许多地方使用。无论如何,HashMap的构建工作并存储正确的值。如果我按如下方式创建构造函数:

private final Map<String, AppProperties> internalMap = new HashMap<String, AppProperties>();

    public ApplicationMap() {
        System.out.println("In Constructor");
        if (this.internalMap.isEmpty()){
            System.out.println("Is Empty ");
            this.buildMap(this.internalMap);
        }
    }

构造函数始终将internalMap视为空并重建它。我试图在Get方法中做同样的事情(使构造函数公共ApplicationMap(){})

检查它是否有值:

public AppProperties get(Object key) {
        System.out.println("in Get");
            try {
            if (this.internalMap.containsKey(key)) {
                System.out.println("Has Key" + key);
                return this.internalMap.get(key);

            } else {
                this.buildMap(this.internalMap);
                if (this.internalMap.containsKey(key)) {
                    System.out.println("Has Key" + key);
                    return this.internalMap.get(key);

                } else {
                    System.out.println("No Key in ApplicationMap " + key);
                    AppProperties ap = new AppProperties();
                    return ap;
                }
            }
        } catch (Exception e) {
            System.out.println("ApplicationMap" + e.toString());
            AppProperties ap = new AppProperties();
            return ap;
        }

    }

但是这似乎永远找不到关键值,每次都会通过this.buildMap。所以我显然错过了一些东西。我认为将buildMap放在get中似乎是正确的做法,但是

这是buildMap的缩写代码:

private void buildMap(Map<String, AppProperties> theMap) {

        try {
            Session s = ExtLibUtil.getCurrentSession();
            mainDB = s.getCurrentDatabase();
            vwApps = mainDB.getView("vwWFSApplicationsEnabled");
            serverName = s.createName(mainDB.getServer()).getCommon();
            veCol = vwApps.getAllEntries();
            ve = veCol.getFirstEntry();
            tVE = null;
            while (ve != null) {
                AppProperties ap = new AppProperties();
                tVE = veCol.getNextEntry(ve);
                colVal = ve.getColumnValues();
                appName = colVal.get(0).toString();
                System.out.println("Application = " + appName);
                String tAppRepID = colVal.get(3).toString();
                ap.setAppRepID(colVal.get(3).toString());
                ap.setHelpRepID(colVal.get(4).toString());
                ap.setRuleRepID(colVal.get(5).toString());
                System.out.println("Put Map");
                theMap.put(appName, ap);
                //System.out.println("Recycle ve");
                ve.recycle();
                ve = tVE;
            }
            //System.out.println("Finished Loop");
        } catch (Exception e) {
            System.out.println(e.toString());
        } finally {
            Utils.recycleObjects( vwApps, vwForms, ve, veCol,);
            //System.out.println("Finally Finished");
        }
    }

2 个答案:

答案 0 :(得分:1)

构造函数始终只为对象调用。这就是internalMap在构造函数中始终为空的原因。

不要为私有方法buildMap提供参数,而是直接访问internalMap

答案 1 :(得分:1)

我有一个软件开发公理 - 容易找到的错误难以修复,而难以找到的错误很容易修复,而且这是一个经典案例。 解决方案是,当我从SSJS调用bean时,我使用了sysntax: WFSAppProperties()。get(某些键值).getAppFilePath(); 执行此操作时,internalMap始终被视为空,但是,它必须是: WFSAppProperties.get(某些键值).getAppFilePath(); 两种情况都返回正确的值,但第一种情况总是重新加载internalMap,而第二种只在初始加载时加载内部映射一次。当EL调用时,它始终正常工作。 感谢Knut的时间和对挣扎的JAVA Bean newby的耐心。