Vaadin “瓦丁”;id为xy的连接器已注册";

Vaadin “瓦丁”;id为xy的连接器已注册";,vaadin,Vaadin,在我的Vaadin应用程序中的某个地方,当我使用第二个浏览器连接时,就会出现此异常 原因:java.lang.RuntimeException:id为22的连接器已注册! 在com.vaadin.ui.ConnectorTracker.registerConnector(ConnectorTracker.java:133) 它总是发生在同一个地方,但我不知道为什么确切的原因,这一定是在其他地方 我想我可能是从另一个会话中窃取UI组件——这不是我的意图。 目前,我没有看到我可能在多个会话中使用的任

在我的Vaadin应用程序中的某个地方,当我使用第二个浏览器连接时,就会出现此异常

原因:java.lang.RuntimeException:id为22的连接器已注册!
在com.vaadin.ui.ConnectorTracker.registerConnector(ConnectorTracker.java:133)

它总是发生在同一个地方,但我不知道为什么确切的原因,这一定是在其他地方

我想我可能是从另一个会话中窃取UI组件——这不是我的意图。 目前,我没有看到我可能在多个会话中使用的任何
静态
UI组件实例

我如何调试这个?这已经成为一个相当大的项目。
要查找的任何提示?

是的,这通常是因为您正在附加一个已在其他会话中附加的组件

尝试使用临时的
连接器跟踪程序
记录发生故障的连接器,以便下次发生故障时,您可以捕获它

例如:

public class SomeUI extends UI {

  private ConnectorTracker tracker;

  @Override
  public ConnectorTracker getConnectorTracker() {
    if (this.tracker == null) {
      this.tracker =  new ConnectorTracker(this) {

        @Override
        public void registerConnector(ClientConnector connector) {
          try {
            super.registerConnector(connector);
          } catch (RuntimeException e) {
            getLogger().log(Level.SEVERE, "Failed connector: {0}", connector.getClass().getSimpleName());
            throw e;
          }
        }

      };
    }

    return tracker;
  }
}
我想我可能是从另一个会话中窃取UI组件——这不是我的意图。目前,我没有看到我可能在多个会话中使用的UI组件的任何静态实例。 就这样。实际上,我是在不知情的情况下偷UI组件的

它很好地隐藏在一个似乎对所有实例都相同的部分中。这是真的:算法是一样的

但这并不意味着我也应该重用相同的UI组件


感谢那些仔细观察的人。

以下是我如何修复它的-

1) 查找跨会话共享的组件。例如,如果您将组件声明为静态组件,那么它将被创建一次并共享

2) 如果在找出真正的问题之前,您无法找到它并需要解决,请将所有addComponent调用放入try and in catch add以下代码中-

getUI().getConnectorTracker().markAllConnectorsDirty();
getUI().getConnectorTracker().markAllClientSidesUnititialized();
getPage().reload():
这将清除旧连接器,并仅在页面出现故障时才能正确重新加载页面。对我来说,当我注销并重新登录时,它失败了

一旦你发现了真正的问题,你可以解决它,直到然后通知你的客户重新加载


****注意-唯一的解决方案是删除共享组件。这只是一种解决方法。

通过在调试模式下运行应用程序(在浏览器URL的末尾添加?调试),您将能够浏览到该组件,例如:

-UIConnector(0)
--垂直布局输出连接器(1)
---…
---标签连接器(22)


其中22是堆栈跟踪中的id。在代码中找到此组件,并确保它不是静态的(是的,我看到了此类示例)。

您是否使用spring管理vaadin?观察可能会对您有所帮助否我没有使用spring我的组件与此连接器有什么关系?有什么方法可以让你自己注册一个吗?为了子孙后代,这里有一个类似的线程(已解决)。肯定是一个用于你自己的私人知识库,谢谢@何塞·路易斯·马丁你好!当我把这段代码放到我的UI类中时,我得到一个NullPointerException。。。你知道为什么吗?@Manu-Oh!是的,我只是修改了代码。谢谢。@JoseLuisMartin谢谢你的修复。
connector.getClass().getSimpleName()
给出“失败的连接器:水平拆分面板”。我的代码中只有一个HorizontalSplitPanel,所以很容易找到。当我将其添加到其他组件时,会提供该错误。那么我该怎么做才能避免错误呢?只需确保您没有两次添加同一个实例。您是否尝试过Jose Luis Martin解决方案来调试此问题并最终找到解决方案?没有。我通过再次查看我的代码找到了它-我认为它是“安全的”