在 Vaadin 8 中刷新 DataProvider for Grid 中的项目,并实现 `getId` 方法
Refreshing item in DataProvider for Grid, and implementing `getId` method, in Vaadin 8
Grid
和其他小部件使用的 DataProvider::refreshItem
方法为小部件提供了两种替代方法来识别您尝试刷新的包含项目:
- 依靠我的 bean 的
equals
和 hashCode
实现,可靠地识别相同的对象而不依赖于可变成员字段 (属性)。
- 实施
getId
引用 JavaDoc:
void refreshItem(T item)
Refreshes the given item. This method should be used to inform all DataProviderListeners that an item has been updated or replaced with a new instance.
For this to work properly, the item must either implement Object.equals(Object)
and Object.hashCode()
to consider both the old and the new item instances to be equal, or alternatively getId(Object)
should be implemented to return an appropriate identifier.
上面的最后一个条款是棘手的部分。
➥ 我的问题是:如何实现DataProvider::getId
?
我见过的每个 DataProvider
示例都会导致 DataProvider 由其他调用返回或内部生成,而不是子类化。如果通往 DataProvider
的正常路径在编写您自己的实现时不涉及子类化,那么如何覆盖 getId
以提供实现?
如果您愿意,您仍然可以创建自己的数据提供程序子 class,即使大多数示例使用更方便的工厂方法。从 AbstractBackEndDataProvider
或 ListDataProvider
扩展通常是最好的起点。
另一种方法是使用 CallbackDataProvider
的三参数构造函数,它将两个常规回调作为前两个参数,然后是第三个回调,它接收一个项目并且应该 return 一个对象可以用作该项目的标识符。
直接或间接覆盖 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();
}
}
您可以找到工作示例代码 here。
Grid
和其他小部件使用的 DataProvider::refreshItem
方法为小部件提供了两种替代方法来识别您尝试刷新的包含项目:
- 依靠我的 bean 的
equals
和hashCode
实现,可靠地识别相同的对象而不依赖于可变成员字段 (属性)。 - 实施
getId
引用 JavaDoc:
void refreshItem(T item)
Refreshes the given item. This method should be used to inform all DataProviderListeners that an item has been updated or replaced with a new instance.
For this to work properly, the item must either implement
Object.equals(Object)
andObject.hashCode()
to consider both the old and the new item instances to be equal, or alternativelygetId(Object)
should be implemented to return an appropriate identifier.
上面的最后一个条款是棘手的部分。
➥ 我的问题是:如何实现DataProvider::getId
?
我见过的每个 DataProvider
示例都会导致 DataProvider 由其他调用返回或内部生成,而不是子类化。如果通往 DataProvider
的正常路径在编写您自己的实现时不涉及子类化,那么如何覆盖 getId
以提供实现?
如果您愿意,您仍然可以创建自己的数据提供程序子 class,即使大多数示例使用更方便的工厂方法。从 AbstractBackEndDataProvider
或 ListDataProvider
扩展通常是最好的起点。
另一种方法是使用 CallbackDataProvider
的三参数构造函数,它将两个常规回调作为前两个参数,然后是第三个回调,它接收一个项目并且应该 return 一个对象可以用作该项目的标识符。
直接或间接覆盖 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();
}
}
您可以找到工作示例代码 here。