Vaadin“连接器ID xy已经注册”

11

在我的Vaadin应用程序中,只要我使用第二个浏览器连接,就会出现此异常:

Caused by: java.lang.RuntimeException: A connector with id 22 is already registered! at com.vaadin.ui.ConnectorTracker.registerConnector(ConnectorTracker.java:133)

它总是发生在同一个地方,但我不知道确切的原因,因为导致这个异常的原因可能在其他地方。

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

我该如何调试呢?这已经成为一个相当大的项目了。 有什么提示可以提供吗?


你正在使用Spring来管理Vaadin吗? - Paolo Forgia
看看这个链接或许可以帮到你:http://ttlnews.blogspot.nl/2013/07/vaadin-error-connector-with-id-7-is.html - Paolo Forgia
不,我没有使用Spring。 - Atmocreations
我的组件与这个连接器有什么关系?您是否可以注册一个自己的连接器? - Atmocreations
为了后人的参考,这里提供一个类似的帖子(已解决)在 Vaadin 论坛 中。 - jsosnowski
4个回答

6

通常这是因为你正在连接一个已在其他会话中连接的组件。尝试使用临时ConnectorTracker登录失败的连接器,这样下一次出现此问题时,您可以捕获它。

例如:

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;
  }
}

绝对是值得收藏在你自己的私人知识库中的,谢谢! - Atmocreations
@jose-luis-martin 你好!当我把这段代码放到我的UI类中时,我得到了一个NullPointerException... 你有任何想法吗? - Manu
@Manu 哦!是的,我刚刚编辑了一下修复了代码。谢谢。 - Jose Luis Martin
@JoseLuisMartin 感谢您的修复。connector.getClass().getSimpleName() 返回 'Failed connector: HorizontalSplitPanel'。我的代码中只有一个 HorizontalSplitPanel ,因此很容易找到。当我将其添加到另一个组件时,就会出现错误。所以我应该怎么做才能避免这个错误呢? - Manu
请确保您不会将相同的实例添加两次。 - Jose Luis Martin

1
这是我修复它的方法 -
1)查找您在会话间共享的组件。例如,如果您已将组件声明为静态,则它将仅创建一次并进行共享。
2)如果您无法找到它,并且希望在找出真正问题之前有一个解决方法,请将所有addComponent调用放置在try中,在catch中添加以下代码 -
getUI().getConnectorTracker().markAllConnectorsDirty();
getUI().getConnectorTracker().markAllClientSidesUnititialized();
getPage().reload():

这将清除旧的连接器,并在页面加载失败时正确地重新加载页面。对我来说,当我退出并重新登录时,它会失败。
一旦找到真正的问题,您可以修复它,然后通知客户重新加载。
**** 注意 - 唯一的解决方案是删除共享组件,这只是一个解决方法。

1
我觉得我可能从其他会话中窃取了UI组件-这不是我的意图。目前,我没有看到任何静态实例的UI组件,我可能在多个会话中使用。

就是这样。事实上,我在没有事先知道的情况下窃取了UI组件。

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

并不意味着我也应该重复使用相同的UI组件...

感谢那些仔细查看的人。


你尝试过使用Jose Luis Martin的解决方案来调试这个问题并最终找到解决方案了吗? - Manu
没有,我是通过重新查看我的代码找到的 - 我原本认为它是“安全的”。 - Atmocreations

0

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

-UIConnector(0)
--VerticalLayoutConnector(1)
---...
---LabelConnector(22)

其中22是来自您的堆栈跟踪的ID。在您的代码中查找此组件,并确保它不是静态的(是的,我看到过这样的例子)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接