在 Vaadin UI 上执行异步操作

Ben*_*ári 1 user-interface asynchronous vaadin spring-boot 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);
            });
        });
Run Code Online (Sandbox Code Playgroud)

我正在尝试按照文档中的说明访问 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
    {
    }
Run Code Online (Sandbox Code Playgroud)

}

我是否错过了在此网页上实现异步行为的内容?任何帮助表示赞赏。

Lei*_*and 7

在这种情况下的问题是第一个回调以 a 终止,NullPointerException因为当它从后台线程运行时UI.getCurrent()返回nullCompletableFuture只会忽略异常,除非您明确处理它(例如使用handle代替thenAccept)或阻止结果。

您可以通过UI ui = UI.getCurrent();在点击侦听器的开头添加,然后uisupplyAsyncthenAccept回调中引用而不是在UI.getCurrent()那里使用来解决此问题。