2012-04-19 57 views
0

我在維護屏幕中實現了自動轉換器(forceSelection = false)。 要編輯現有記錄,用戶將從自動完成列表中選擇ID。JSF轉換器實現

要添加新記錄,用戶將在同一個框中輸入新的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; 
} 

問候,

希裏什

回答

1

據我理解這(還在學習我自己),轉換器滿足只有一個目的:它準備在視圖中使用您的自定義對象(符getAsString )並將字符串轉換回對象(getAsObject)。只要輸入(電臺列表,文本字段,自動完成)綁定到屬於您自定義對象類型的後臺bean中的變量,就會使用它。您可以自由決定使用什麼字符串來表示對象,以及如何使用此字符串來查找對象。

考慮到這一點,我不會使用轉換器來存儲對象的本地列表,也不會讓它處理創建過程本身。相反,我會假設有一個支持bean的地方,它保存你的數據對象並照顧你所有的邏輯。這個bean可以有一個名爲schoolMasters的列表,可以查詢它包含的對象(類似於你所做的)。然後,您可以通過它處理未發現的情況的方式實現查找,並始終返回一個有效的對象(可能是一個新的對象),或者您可以捕獲轉換器中未找到的情況,然後觸發一個createNew()從bean中獲得一個新的實例。

恕我直言,這將實例的管理從轉換器的翻譯目的中分離出來。此外,從您的代碼中,您似乎有兩個地方可以查找對象 - 通過getMasterService()(本地方法?)並在您存儲的ArrayList內。我不太得到這個...


至於你的問題與瀏覽器共享一個實例:這聽起來像一個範圍問題。如果您的後臺bean(應該存儲和管理數據)處於應用程序範圍內,那麼只要應用程序運行,同一組數據就可用。這些數據將跨瀏覽器和用戶使用。另一方面,如果將bean放入會話作用域中,則每個會話都將創建自己的bean實例並存儲唯一的數據。同樣,只要單個視圖和請求bean被丟棄併爲每個http請求重新生成,視圖範圍的bean就會存活。你可以在這裏閱讀更多:How to choose the right scope

那裏的答案談論豆(這是你的數據通常居住的地方)。我不確定轉換器,我將它們視爲可在應用程序範圍內使用的類,以便每個會話和視圖都可以使用它們進行翻譯 - 如果您在那裏保留一個列表,它可能在全球範圍內可用。