2012-04-19 98 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

那里的答案谈论豆(这是你的数据通常居住的地方)。我不确定转换器,我将它们视为可在应用程序范围内使用的类,以便每个会话和视图都可以使用它们进行翻译 - 如果您在那里保留一个列表,它可能在全球范围内可用。