刷新网格的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
无效刷新项(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
,因为除了刷新数据提供程序之外,您还需要它。