メンテナンス画面でAutoconverter(forceSelection = false)を実装しました。 既存のレコードを編集するには、ユーザーはオートコンプリートリストからIDを選択します。JSF Converterの実装
新しいレコードを追加するには、同じボックスに新しいIDを入力します。
コンバータでは、IDを使用してDB内のレコードを検索しようとします。
指定されたIDを持つ新しい空のオブジェクトが作成され、重複を避けるために、このオブジェクトはConverterで管理されている配列リストに追加されます。
これは、単一のブラウザセッションで期待どおりに動作します。しかし、複数のブラウザでテストしているうちに、Arrayリストはすべてのインスタンスで共有されています。
アプローチが正しいかどうかはわかりませんが、あなたが私に別のアプローチを提案していただけない場合は、
private List<SchoolMasterDetails> schoolMasterDetailsDB = new ArrayList<SchoolMasterDetails>();
@Override
public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
SchoolMasterDetails selectedObject = null;
System.out.println("getAsObject ==> Entering.");
System.out.println("getAsObject ==> '" + submittedValue + "'");
if (!submittedValue.trim().equals("")) {
selectedObject = (SchoolMasterDetails) getMasterService().getSchoolbyCode(submittedValue);
if (selectedObject == null) {
// search Object on localDB
for (SchoolMasterDetails p : schoolMasterDetailsDB) {
if (p.getSchoolCode().equalsIgnoreCase(submittedValue.trim())) {
System.out.println("getAsObject from ArrayList ==> " + p);
return p; // return selectedObject from list of created objects
}
}
System.out.println("getAsObject ==> selectedObject is null, Hence Creating new Object");
selectedObject = new SchoolMasterDetails();
selectedObject.setSchoolCode(submittedValue.trim());
selectedObject.setSchoolName("TEST TEST TEST");
schoolMasterDetailsDB.add(selectedObject);
}
else {
System.out.println("getAsObject from Database ==> " + selectedObject);
}
}
System.out.println("getAsObject ==> " + selectedObject);
}
System.out.println("getAsObject ==> Exiting.");
return selectedObject;
}
よろしく、
Shirish