在 Vaadin 8 中刷新 DataProvider for Grid 中的项目,并实现 `getId` 方法

Refreshing item in DataProvider for Grid, and implementing `getId` method, in Vaadin 8

Grid 和其他小部件使用的 DataProvider::refreshItem 方法为小部件提供了两种替代方法来识别您尝试刷新的包含项目:

引用 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,即使大多数示例使用更方便的工厂方法。从 AbstractBackEndDataProviderListDataProvider 扩展通常是最好的起点。

另一种方法是使用 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