Grid
和其他小部件使用的DataProvider::refreshItem
方法建议小部件采用两种替代方法来识别您尝试刷新的哪些包含的项目:
- 依靠我的 bean 的
equals
和hashCode
实现,可靠地识别相同的对象,而不依赖于可变的成员字段(属性(。 - 实施
getId
引用JavaDoc:
void refreshItem(T item)
刷新给定项目。此方法应用于通知所有 DataProviderListener 某个项已更新或替换为新实例。
若要正常工作,项必须实现
Object.equals(Object)
和Object.hashCode()
,以将旧项实例和新项实例视为相等,或者应实现getId(Object)
以返回适当的标识符。
上面的最后一句是棘手的部分。
➥ 我的问题是:如何实施DataProvider::getId
?
我看到的每个DataProvider
示例都会导致 DataProvider 由其他调用返回或内部生成,而不是子类化。如果在编写自己的实现时,通往DataProvider
的正常路由不涉及子类化,那么如何覆盖getId
以提供实现?
如果需要,您仍然可以创建自己的数据提供程序子类,即使大多数示例使用更方便的工厂方法也是如此。从AbstractBackEndDataProvider
或ListDataProvider
扩展通常是最好的起点。
另一种方法是使用CallbackDataProvider
的三参数构造函数,该构造函数将两个常规回调作为前两个参数,然后是接收项的第三个回调,并应返回可用作该项标识符的对象。
直接或间接覆盖getId
被视为相对较少使用的功能,因此在这些情况下,我们选择不污染工厂方法的顶级DataProvider
接口。
public class EmployeeDataProvider extends AbstractBackEndDataProvider<Employee, String> {
private static final long serialVersionUID = 1L;
private final EmployeeService employeeService;
public EmployeeDataProvider(EmployeeService employeeService) {
// TODO Auto-generated constructor stub
this.employeeService = employeeService;
}
@Override
protected Stream<Employee> fetchFromBackEnd(Query<Employee, String> query) {
// TODO Auto-generated method stub
return employeeService.fetchEmployees(query.getFilter().orElse(null), query.getLimit(), query.getOffset(),
query.getSortOrders()).stream();
}
@Override
protected int sizeInBackEnd(Query<Employee, String> query) {
// TODO Auto-generated method stub
return employeeService.countEmployees(query.getFilter().orElse(null));
}
@Override
public Object getId(Employee item) {
// TODO Auto-generated method stub
return item.getId();
}
}
您可以在此处找到工作示例代码。