在Vaadin UI上执行异步操作

时间:2020-06-23 19:09:48

标签: spring-boot user-interface asynchronous vaadin vaadin-flow

我有一个与Vaadin集成(v14)的Spring Boot项目。我希望我的应用程序执行一些后台操作,并在基于Vaadin的前端上表示结果。为此,我有一个视图,该视图是使用Vaadin Designer(.js)生成并连接到Java伴随类的Polymer模板。在此视图中,我仅添加了一个使用以下侦听器初始化的按钮:

        _btnMyTriggerButton.addClickListener(event -> {

        CompletableFuture<Void> c = CompletableFuture.supplyAsync(() -> {
            for (int i = 0; i < 5; i++)
            {
                try
                {
                    System.out.println("Waiting");
                    Thread.sleep(1000);
                    UI.getCurrent().access(() -> {
                        Notification.show("Waiting");
                    });
                }
                catch (InterruptedException e)
                {
                }
            }
            return "Waiting over. Greet!";
        }).thenAccept(s -> {
            System.out.println(s);
            UI.getCurrent().access(() -> {
                Notification.show(s);
            });
        });

我正在尝试按照文档所述访问UI。但是,执行此操作时,它只会到达第一个“等待”状态,然后停止。如果我删除了UI交互( Notification.show()),则输出将按需要打印到后端,但是在尝试在UI上进行任何交互时不会输出。

我的Java同伴类的结构如下:

@Tag("my-view")
@JsModule("./my-view.js")
@Route("")
@Push(PushMode.AUTOMATIC)
public class MyView extends PolymerTemplate<MyView.MyModel>
{
    @Id("trigger-button")
    private Button _btnMyTriggerButton;

    MyView() {
     // listener initialization code described above
    }
    public interface MyModel extends TemplateModel
    {
    }

}

我想念一些东西来实现此网页上的异步行为吗? 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:6)

在这种情况下,问题是第一个回调以NullPointerException结尾,因为UI.getCurrent()从后台线程运行时返回null。除非您明确处理(例如,使用CompletableFuture而不是handle),否则thenAccept只会忽略该异常或阻塞结果。

您可以通过以下方法解决此问题:在点击侦听器的开头添加UI ui = UI.getCurrent();,然后在uisupplyAsync回调中都引用thenAccept,而不要使用{{1 }}。