メンテナンス画面に Autoconverter (forceSelection=false) を実装しました。既存のレコードを編集するには、ユーザーはオートコンプリート リストから ID を選択します。
新しいレコードを追加するには、ユーザーは同じボックスに新しい ID を入力します。
コンバーターでは、アプリケーションは ID を使用して DB 内のレコードを検索しようとします。
見つからない場合は、指定された ID で新しい空のオブジェクトが作成され、重複を避けるために、このオブジェクトが Converter に保持されている配列リストに追加されます。
これは、単一のブラウザ セッションで期待どおりに機能します。しかし、複数のブラウザーでテストしているときに、配列リストがすべてのインスタンスで共有されていることがわかりました。
私が取ったアプローチが正しいかどうかわかりませんか?そうでない場合は、別のアプローチを提案してください。
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;
}
よろしく、
シリッシュ