ビューのコンテンツを読み取り、SelectItem オブジェクトのハッシュマップを格納するセッション スコープ Bean があります。これらは、XPage でコンボボックスの値を設定するために使用されます。
最も内側のループで ViewEntry オブジェクトをリサイクルしようとすると、コードは正常に動作します。行がコメントアウトされている場合、SelectItems が正常に返されます。行がコメント解除されている場合、コンボボックスは空です。だから私が知りたいのは:
- なぜこうなった?
- これを修正し、優れた開発者のようにオブジェクトを正しくリサイクルするにはどうすればよいですか?
- オブジェクトを明示的にリサイクルできない場合、メモリなどにどのような影響を与える可能性がありますか?
コード (問題のある行が強調表示され、現在コメントアウトされている):
public class comboBox extends HashMap<String, List<SelectItem>> implements Serializable {
private static final long serialVersionUID = 1L;
public comboBox() {
this.init();
}
private void init() {
Database database = null;
View vwData = null;
ViewNavigator navData = null;
try {
PrimeUser thisUser = (PrimeUser) resolveVariable(FacesContext.getCurrentInstance(), "PrimeUser");
String lang = thisUser.getLang();
database = getCurrentDatabase();
vwData = database.getView("DataLookup");
navData = vwData.createViewNavFromCategory(lang);
ViewEntry keyCat = navData.getFirst();
ViewEntry nextCat = null;
while (keyCat != null) {
String thisKey = (String) keyCat.getColumnValues().get(1);
List<SelectItem> options = new ArrayList<SelectItem>();
options.add(new SelectItem("Please select..."));
ViewEntry dataEntry = navData.getChild(keyCat);
ViewEntry nextChild = null;
while (dataEntry != null) {
nextChild = navData.getNextSibling();
Object optValue = dataEntry.getColumnValues().get(2);
String optLabel = (String) dataEntry.getColumnValues().get(3);
options.add(new SelectItem(optValue, optLabel));
// dataEntry.recycle(); //<---- PROBLEM HERE
dataEntry = nextChild;
}
this.put(thisKey, options);
nextCat = navData.getNextCategory();
keyCat.recycle();
keyCat = nextCat;
}
} catch (NotesException e) {
e.printStackTrace();
} finally {
try {
navData.recycle();
vwData.recycle();
database.recycle();
} catch (NotesException e) {
}
}
}
public List<SelectItem> get(String key) {
return this.get(key);
}
}
解決済み:
解決策はいらいらするほど単純でした (サーバー ログ出力を再度確認するよう思い出させてくれた Sven Hasselbach に感謝します)。変更は簡単でした - 次の行を交換してください:
nextCat = navData.getNextCategory();
このため:
nextCat = getNextSibling(keyCat);
「getNextCategory」は ViewNavigator のメソッドであり、パラメータはありません。現在のエントリに続く次のカテゴリのみを取得します。現在のエントリがリサイクルされた場合 (上記の場合のように)、明らかに現在のエントリは null であり、メソッドは例外をスローします。
「getNextSibling」にはオプションの ViewEntry パラメーターがあり、指定すると、それ以外の場合に使用する現在の ViewEntry へのポインターをオーバーライドします。
私は金曜日のせいです。