刷新网格的DataProvider中的项,并在Vaadin 8中实现“getId”方法

刷新网格的DataProvider中的项,并在Vaadin 8中实现“getId”方法,vaadin,vaadin8,Vaadin,Vaadin8,Grid和其他窗口小部件使用的方法为窗口小部件提供了两种备选方法,以确定您试图刷新的包含项: 依赖我的bean的equals和hashCode实现,可靠地标识同一对象,而不依赖可变成员字段(属性) 实现getId 引用JavaDoc: 无效刷新项(T项) 刷新给定项。此方法应用于通知所有DataProviderListeners某个项已被更新或替换为新实例 此项目必须实现对象.Error(object)< /COD>和对象.HASCODE()/,以考虑新的和新的项实例相等,或者可以实现返回适

Grid
和其他窗口小部件使用的方法为窗口小部件提供了两种备选方法,以确定您试图刷新的包含项:

  • 依赖我的bean的
    equals
    hashCode
    实现,可靠地标识同一对象,而不依赖可变成员字段(属性)
  • 实现
    getId
引用JavaDoc:

无效刷新项(T项)

刷新给定项。此方法应用于通知所有DataProviderListeners某个项已被更新或替换为新实例

<>此项目必须实现<代码>对象.Error(object)< /COD>和<代码>对象.HASCODE()/<代码>,以考虑新的和新的项实例相等,或者可以实现返回适当的标识符。

上面最后一条是棘手的部分

➥ 我的问题是:如何实施?


DataProvider的每个示例
我都看到了由其他调用返回或内部生成的数据提供程序的结果,而不是子类化。如果在编写自己的实现时,到
数据提供程序的正常路径不涉及子类化,那么如何覆盖
getId
以提供实现?

如果愿意,您仍然可以创建自己的数据提供程序子类,即使大多数示例使用更方便的工厂方法。从
AbstractBackEndDataProvider
ListDataProvider
扩展通常是最好的起点

另一种方法是使用
CallbackDataProvider
的三参数构造函数,该构造函数将两个常规回调作为前两个参数,然后是第三个回调,该回调接收一个项,并应返回一个可用作该项标识符的对象

直接或间接重写
getId
被视为相对较少使用的功能,因此我们选择不污染顶级
DataProvider
接口,并使用工厂方法处理这些情况。

公共类EmployeeDataProvider扩展了AbstractBackEndDataProvider{
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();
  }
}
私有静态最终长serialVersionUID=1L; 私人最终雇员服务雇员服务; 公共EmployeeDataProvider(EmployeeService EmployeeService){ //TODO自动生成的构造函数存根 this.employeeService=employeeService; } @凌驾 从后端获取受保护的流(查询){ //TODO自动生成的方法存根 返回employeeService.fetchEmployees(query.getFilter().orElse(null)、query.getLimit()、query.getOffset(), query.getSortOrders()).stream(); } @凌驾 受保护的int sizeInBackEnd(查询){ //TODO自动生成的方法存根 返回employeeService.countEmployees(query.getFilter().orElse(null)); } @凌驾 公共对象getId(员工项){ //TODO自动生成的方法存根 return item.getId(); } }

您可以找到工作示例代码。

我不明白为什么覆盖
getId
会相对较少。使用后端/存储库类而不是从数据库/服务检索时返回新对象,以替换旧对象,而不是改变原始对象,这似乎已经足够常见了。因此,如果替换数据提供程序中的对象而不是更新对象,则需要使用<代码> GETId < /代码>方法,如果不执行<代码>等于< <代码> > <代码> hash码< /代码>,这样就不会考虑更改字段。似乎
getId
更简单。我不是在争论,只是在我的理解中似乎遗漏了一些东西。假设您仍然会在数据对象中实现
equals
hashCode
,因为除了刷新
数据提供程序之外,您还需要它。