Vaadin “A connector with id xy is already registered”

前端 未结 4 936
眼角桃花
眼角桃花 2021-01-02 04:01

Somewhere in my Vaadin application, I\'m getting this exception as soon as I connect using a second browser

Caused by: java.lang.RuntimeException: A connector

相关标签:
4条回答
  • 2021-01-02 04:33

    Yes, this usually happens because you are attaching a component already attached in other session.

    Try logging the failed connector with a temporal ConnectorTracker, So the next time that it happens, you can catch it.

    For example:

    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;
      }
    }
    
    0 讨论(0)
  • 2021-01-02 04:34

    Here is how I fixed it -

    1) look for components you have shared across sessions. For example if you have declared a component as static it will be created once and will be shared.

    2) if you are not able to find it and want a work around until you figure out the real problem, put your all addComponent calls in try and in catch add following code -

    getUI().getConnectorTracker().markAllConnectorsDirty();
    getUI().getConnectorTracker().markAllClientSidesUnititialized();
    getPage().reload():
    

    This will clear old connectors and will reload the page properly only when it fails. For me it was failing when I was logged out and logged in back.

    Once you find the real problem you can fix it till then inform your customers about the reload.

    **** note - only solution is to remove shared components this is just a work around.

    0 讨论(0)
  • 2021-01-02 04:34

    By running your application in debug mode (add ?debug at the end of URL in browser) you will be able to browse to the component, e.g:

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

    where 22 is id from your stack trace. Find this component in your code and make sure that it is not static (yes, I saw such examples).

    0 讨论(0)
  • 2021-01-02 04:36
    I think I might be stealing UI components from the other session - which is not my intention. Currently, I don't see any static instances of UI components I might be using in multiple sessions.

    That was it. I was actually stealing UI components without prior knowledge.

    It was very well hidden in a part which seems to be same for all instances. Which is true: the algorithm is the same.

    Doesn't mean I should've reused the same UI components as well...

    Thanks to those who took a closer look.

    0 讨论(0)
提交回复
热议问题