Vaadin “瓦丁”;id为xy的连接器已注册";
在我的Vaadin应用程序中的某个地方,当我使用第二个浏览器连接时,就会出现此异常Vaadin “瓦丁”;id为xy的连接器已注册";,vaadin,Vaadin,在我的Vaadin应用程序中的某个地方,当我使用第二个浏览器连接时,就会出现此异常 原因:java.lang.RuntimeException:id为22的连接器已注册! 在com.vaadin.ui.ConnectorTracker.registerConnector(ConnectorTracker.java:133) 它总是发生在同一个地方,但我不知道为什么确切的原因,这一定是在其他地方 我想我可能是从另一个会话中窃取UI组件——这不是我的意图。 目前,我没有看到我可能在多个会话中使用的任
原因: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解决方案来调试此问题并最终找到解决方案?没有。我通过再次查看我的代码找到了它-我认为它是“安全的”