Возможно, выполняется в фоновом потоке. UI.getCurrent()
работает только в потоке пользовательского интерфейса.
Вам необходимо сохранить ссылку на пользовательский интерфейс в точке, в которой вы все еще находитесь в потоке пользовательского интерфейса, или путем вызова getUI()
для подключенного компонента. Если ваш метод выполняется в потоке пользовательского интерфейса, вы можете сохранить ссылку там. Затем вы вызываете UI#access
для выполнения любых задач пользовательского интерфейса:
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.getCurrent()
и VaadinSession.getCurrent()
вернут правильные значения.