我正在尝试从Singleton更新简单的Vaadin UI组件:
这里是组成部分:
Varbinary(Max)
这是我的单身人士,我需要在启动时运行
public class MaintenanceModeLogoutMessageLayout extends HorizontalLayout {
public MaintenanceModeLogoutMessageLayout() {
addComponent(new Label("test"));
}
public void changeVisibility(final Boolean visible) {
setVisible(visible);
}
如您所见,我正在触发事件,试图找到现有的bean并调用该对象的方法。
但是问题在于,即使那里是当前的bean,@Singleton
@Startup
public class SingletonTest {
private void executeMaintenanceModeChange(final Boolean maintenance) {
try {
final BeanManager beanManager = InitialContext.doLookup("java:comp/BeanManager");
final Set<Bean<?>> beans = beanManager.getBeans(MaintenanceModeLogoutMessageLayout.class);
final Bean<?> bean = beanManager.resolve(beans);
final CreationalContext<?> cc = beanManager.createCreationalContext(bean);
final MaintenanceModeLogoutMessageLayout object = (MaintenanceModeLogoutMessageLayout) beanManager.getReference(bean,
MaintenanceModeLogoutMessageLayout.class, cc);
if (object == null) {
LOG.warning("Cant find any bean for class " + MaintenanceModeLogoutMessageLayout.class.getSimpleName());
return;
}
Method method = bean.getBeanClass().getDeclaredMethod("changeVisibility", Boolean.class);
method.invoke(object, maintenance);
} catch (final NamingException | IllegalArgumentException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
LOG.log(Level.SEVERE, "Can't lookup object ");
}
}
}
还是UI.getCurrent()
。
如果我将使组件null
出现异常
原因:java.lang.IllegalStateException:会话数据不正确 对于托管Bean可恢复
如何访问UI?我如何以这种方式更新Vaadin组件?
答案 0 :(得分:3)
您的问题是该问题的变体,解决方案是相同的。
Vaadin: get reference of UI to change data
基本上,您将在tomcat / servlet引擎中运行多个UI实例。 (每个用户/浏览器至少一个)
因此,您必须将消息广播到UI的所有实例,然后适当地处理它。
如果它应该没有异步(没有用户操作),则还需要启用推送,以便将消息推送到客户端Web浏览器。 否则,它将仅在下次与vaadin应用程序进行用户交互时显示。