在我的应用程序中,一个安静的 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 的帮助都会非常棒!