我创建了一个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");
}
}
答案 0 :(得分:1)
构造函数始终只为对象调用。这就是internalMap
在构造函数中始终为空的原因。
不要为私有方法buildMap提供参数,而是直接访问internalMap
。
答案 1 :(得分:1)
我有一个软件开发公理 - 容易找到的错误难以修复,而难以找到的错误很容易修复,而且这是一个经典案例。 解决方案是,当我从SSJS调用bean时,我使用了sysntax: WFSAppProperties()。get(某些键值).getAppFilePath(); 执行此操作时,internalMap始终被视为空,但是,它必须是: WFSAppProperties.get(某些键值).getAppFilePath(); 两种情况都返回正确的值,但第一种情况总是重新加载internalMap,而第二种只在初始加载时加载内部映射一次。当EL调用时,它始终正常工作。 感谢Knut的时间和对挣扎的JAVA Bean newby的耐心。