在我的应用程序中,一个安静的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的帮助都会非常棒!
答案 0 :(得分:1)
实际上,手册有解决方案...... https://vaadin.com/book/-/page/advanced.push.html
一旦你使CDI感知,广播公司模式就可以了。