在Singleton的Vaadin组件上调用bean方法

时间:2019-01-07 15:01:08

标签: java vaadin javabeans vaadin7

我正在尝试从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组件?

1 个答案:

答案 0 :(得分:3)

您的问题是该问题的变体,解决方案是相同的。

Vaadin: get reference of UI to change data

基本上,您将在tomcat / servlet引擎中运行多个UI实例。 (每个用户/浏览器至少一个)

因此,您必须将消息广播到UI的所有实例,然后适当地处理它。

如果它应该没有异步(没有用户操作),则还需要启用推送,以便将消息推送到客户端Web浏览器。 否则,它将仅在下次与vaadin应用程序进行用户交互时显示。