0

在我的应用程序中,一个安静的 Web 服务可以触发 CDI 事件(经过测试和工作,事件在预期时触发,一个简单的观察者方法将按计划记录事件)。

但是,在大多数情况下,我需要这些事件来更新管理控制台的 UI,这是一个使用 Vaadin-CDI 的 Vaadin 7.3 应用程序。

当服务被调用时,事件被触发,下面是产生的错误:

Caused by: java.lang.IllegalStateException: CDI listener identified, but there is no active UI available.

调试器在手,我已经检查了 CDI 是否正确启动。东西被注入,@Observes 方法被正确调用等等......

这是 Vaadin UI 的代码:

@CDIUI
public class Console extends UI {

    @Inject
    private PersonDao dao; // Properly injected

    private Layout layout;

    private void addClickedLabel() {
        Label label = new Label("Clicked !!");
        layout.addComponent(label);
    }

    @Override
    protected void init(final VaadinRequest vaadinRequest) {
        layout = new FormLayout();
        Button b = new Button("Click me !!");
        layout.addComponent(b);
        b.addClickListener(clickEvent -> { addClickedLabel(); });
        this.setContent(layout);
    }

    // Method called, but exception raised before !st line is executed.
    private void receiveConnectionEvent(@Observes final ConnectionEvent event) {
        UI.getCurrent().access(() -> {
            String desc = String desc = String.format("Event: %s from %s.", event.getType(), event.getSource());
            Label label = new Label(desc);
            layout.addComponent(label);
        });
    }
}

我已经完成了我的 RTFM 事情,在 google 上试试运气,任何关于如何从 CDI 事件正确更新 UI 的帮助都会非常棒!

4

1 回答 1

1

实际上,手册有解决方案...... https://vaadin.com/book/-/page/advanced.push.html

广播者模式在您使其支持 CDI 后就可以正常工作。

于 2014-08-08T01:53:40.287 回答