如何在 Mono.subscribe 中使用 UI.getCurrent().navigate("route")

How to use UI.getCurrent().navigate("route") inside Mono.subscribe

  public void onAlfrescoTicketReceived(Mono<Ticket> ticket) {
    ticket
        .log()
        .subscribe(
            consumer -> {
              this.sessionService.setTicket(consumer.getTicket());
              UI.getCurrent().navigate("route");
            });
  }

sessionService 有效,但 UI.getCurrent returns 无效。有没有办法在订阅内导航?

它可能是在后台线程中执行的。 UI.getCurrent() 仅在 UI 线程中有效。

您需要在您仍在 UI 线程中的某个位置存储对 UI 的引用,或者通过在附加组件上调用 getUI()。如果您的方法在 UI 线程中执行,那么您可以将引用存储在那里。然后你调用 UI#access 来执行任何 UI 任务:

public void onAlfrescoTicketReceived(Mono<Ticket> ticket) {
    UI ui = UI.getCurrent();
    ticket
        .log()
        .subscribe(
            consumer -> {
              this.sessionService.setTicket(consumer.getTicket());
              ui.access(() -> ui.navigate("route"));
            });
}

从后台线程调用时使用 UI#access 可确保会话已锁定,因此 UI 状态下不会有任何冲突。它还确保 UI.getCurrent()VaadinSession.getCurrent() returns 正确的值。