REST触发的CDI事件无法更新Vaadin UI

时间:2014-08-08 01:31:30

标签: java java-ee vaadin cdi wildfly-8

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

但是,在大多数情况下,我需要这些事件来使用Vaadin-CDI更新管理控制台的UI,这是一个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事情,试着用谷歌运气,任何有关如何从CDI事件中正确更新UI的帮助都会非常棒!

1 个答案:

答案 0 :(得分:1)

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

一旦你使CDI感知,广播公司模式就可以了。