0

我已经在维护屏幕中实现了 Autoconverter(使用 forceSelection=false)。要编辑现有记录,用户将从自动完成列表中选择 ID。

要添加新记录,用户将在同一框中输入新 ID。

在转换器中,应用程序将尝试使用 ID 搜索数据库中的记录。
如果未找到,则使用提供的 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;
}

问候,

希里什语

4

1 回答 1

1

据我了解(仍在学习自己),转换器仅实现一个目的:它准备您的自定义对象以在视图中使用(getAsString)并将字符串转换回对象(getAsObject)。只要输入(单选列表、文本字段、自动完成)与自定义对象类型的支持 bean 中的变量相关联,就会使用它。您可以自由决定应该使用什么字符串来表示您的对象以及如何使用此字符串来查找对象。

考虑到这一点,我不会使用转换器来存储本地对象列表,也不会让它自己处理创建过程。相反,我假设某处有一个支持 bean,它保存您的数据对象并处理您的所有逻辑。这个 bean 可以有一个可以查询它包含的对象的 schoolMasters 列表(类似于您所做的)。然后,您可以在那里实现查找以处理未找到的情况并始终返回有效对象(可能是新对象),或者您可以在转换器中捕获未找到的情况,然后触发acreateNew()从 bean 中获取一个新实例。

恕我直言,这更清楚地将实例的管理与转换器的翻译目的分开。此外,从您的代码来看,您似乎有两个地方可以查找对象 - 通过getMasterService()(本地方法?)和在您存储的ArrayList. 我不太明白这个...


至于您的浏览器共享实例的问题:这听起来像是一个范围问题。如果应该存储和管理数据的支持 bean 在应用程序范围内,那么只要应用程序运行,相同的数据集就可用。这些数据将可跨浏览器以及跨用户使用。

另一方面,如果将 bean 放在会话范围内,每个会话将创建自己的 bean 实例并存储唯一数据。类似地,只要单个视图和请求 bean 被丢弃并为每个 http 请求重新生成,视图范围 bean 就会存在。您可以在此处阅读更多信息:如何选择合适的范围

那里的答案是关于 bean 的(这是您的数据通常所在的位置)。我不确定转换器,我将它们视为在应用程序范围内可用的类,因此每个会话和视图都可以使用它们进行翻译 - 如果您在那里维护一个列表,它很可能是全球可用的。

于 2012-10-25T10:07:13.347 回答