CallbackDataProvider的fetchCallback没有回调,所以grid是空的

CallbackDataProvider's fetchCallback is not callbacked, so the grid is empty

我正在尝试使用 "Grid" vaadin 组件来简单地显示 POJO 列表。为了填充 POJO 列表,我使用 DataProvider.fromCallbacks 并为其设置了 Spring 服务。网格显示正确,但内容为空。当我 运行 处于调试模式的应用程序时,我可以看到从未调用回调方法,这就是网格为空的原因。

这是grid的基本使用所以我真的不明白为什么不用回调

这是我的布局:

@SpringComponent
@Route("")
@PWA(name = "Callcenter dashboard", shortName = "callcenter")
public class CallcenterConfigurationView extends VerticalLayout {

    @Autowired
    private ConfigurationController configurationControler;

    private Grid<CallCenterModel> grid;

    public CallcenterConfigurationView() {
        this.grid =   new Grid<CallCenterModel>();

        grid.addColumn(CallCenterModel::getDescription).setHeader("Description");

        add(grid);

        setSizeFull();

    }


    @PostConstruct
    public void initDataProvider() {

        CallbackDataProvider<CallCenterModel, Void> dataProvider =     DataProvider.fromCallbacks(
                query -> configurationControler.findAllcenters().stream(), 
                query -> configurationControler.countAllcallcenters()
                );
        grid.setDataProvider(dataProvider);
    }

我无法按原样试用您的代码,因为我缺少 ConfigurationControllerCallCenterModel 的实现。当我根据自己的假设填写空白时,我最终得到了确实调用了回调的东西。这会导致另一个错误,但那是另一回事了。

关于为什么在您的情况下不会调用查询方法的一些疯狂猜测:

  • 也许计数回调 returns 0?在这种情况下,无需获取任何项目。
  • 也许有一些东西可以阻止 initDataProvider 成为 运行 以便网格不使用您的数据提供程序?
  • 在您的数据提供者被分配后,也许还有其他东西可以将不同的数据提供者分配给网格?

通过设置一些断点或添加一些日志记录来测试这些事情是否发生应该非常简单。

如果我稍微调整您的代码以抽象掉 ConfigurationController 部分,那么我就不需要数据库来 运行 该示例,那么一切都对我有用。 (我还做了一些其他的小调整,只是为了让示例更短几行)

@SpringComponent
@Route("dashboard")
public class CallcenterConfigurationView extends VerticalLayout {
    // My approximation of the relevant parts of CallCenterModel
    public static class CallCenterModel {
        private String description;

        public CallCenterModel(String description) {
            this.description = description;
        }

        public String getDescription() {
            return description;
        }
    }

    // A fake "database" containing 100 instances 
    private static List<CallCenterModel> callCenterModels = IntStream.range(0, 100)
            .mapToObj(index -> new CallCenterModel("Call center " + index))
            .collect(Collectors.toList());

    private Grid<CallCenterModel> grid = new Grid<>();

    public CallcenterConfigurationView() {
        grid.addColumn(CallCenterModel::getDescription).setHeader("Description");

        add(grid);

        setSizeFull();
    }

    @PostConstruct
    public void initDataProvider() {
        CallbackDataProvider<CallCenterModel, Void> dataProvider = DataProvider.fromCallbacks(
            query -> callCenterModels
                     .subList(query.getOffset(), query.getOffset() + query.getLimit())
                     .stream(),
            query -> callCenterModels.size());
        grid.setDataProvider(dataProvider);
    }
}