Vaadin UI元素中的CompletableFuture <t>对象?

时间:2017-06-12 19:06:29

标签: java spring asynchronous spring-boot vaadin

我的目标是在返回CompletableFuture的方法中调用API,这样我的vaadin UI就不会冻结。

这是我到目前为止所做的事情。

API调用:

    @Async
    public CompletableFuture<List<Ownership>> getAllOwnerships() {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<Ownership[]> responseEntity = restTemplate.exchange(baseUrl, HttpMethod.GET, new HttpEntity<>(authentication.getHeaders()), Ownership[].class);
        List<Ownership> ownerships = Arrays.asList(responseEntity.getBody());

        return CompletableFuture.completedFuture(ownerships);
    }

然后在我的服务层中,我有以下内容:

    @Async
    public List<Ownership> getAllOwnerships() {
        if (ownerships.isEmpty()) {
            getOwnershipsFromRemote();
        }

        return ownerships;
    }

该类中该列表的ownerships只是一个空的ArrayList(不是null!)。 ownerships填充了getOwnershipsFromRemote()

private void getOwnershipsFromRemote() {
        CompletableFuture<List<Ownership>> future = remoteOwnershipData.getAllOwnerships();
        boolean breaker = false;

        while (!breaker) {
            if (future.isDone()) {
                try {
                    this.ownerships = future.get();
                    breaker = true;
                } catch (InterruptedException | ExecutionException e) {
                    e.printStackTrace();
                }
            }
        }
    }

调用开始时看到的API调用方法。

现在,在我的Vaadin视图中,我试图做以下事情:

ownershipList = carService.getAllOwnerships();
ownershipListDataProvider = DataProvider.ofCollection(ownershipList);

但是在carService.getAllOwnerships()调用之后,ownershipList为null,而不是我期望的空列表。我希望这个列表会在服务层的getOwnershipsFromRemote()调用中填充,因为它填充了getAllOwnerships返回的相同List。

不幸的是,空指针会中断对DataProvider.ofCollection的调用。

如何在API调用完成后自动更新我的vaadin UI元素(本例中为网格)?最好不要执行while循环来检查是否在vaadin视图中完成CompletableFuture,因为这会阻止UI线程,这是我试图阻止的。

为了清楚起见;当我的视图中的列表更新(已经管理过这个)时,我没有尝试让我的UI自动更新,而是我正在寻找一种有效的方法将CompletableFuture中的数据导入List我的视图已经被观看了,没有用无限循环锁定UI线程。

0 个答案:

没有答案