IllegalStateException Can't move a node from one state tree to another.

If you have been bitten by Vaadin’s IllegalStateException: Can't move a node from one state tree to another. If this is intentional, first remove the node from its current state tree by calling removeFromTree, read on.

The problem is that a component, which is already attached to one UI, is being inserted into another UI as well. This usually happens when:

  • using DI scopes in a bad way on a component, e.g. SessionScoped or Singleton scoped component - a very bad idea. For example, you need to add a scope to a Spring component like @UIScope or @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE). If you don’t add any scope then it’s a singleton = the same component is shared for all the views/users and it leads to this stacktrace.
  • placing a component (e.g. VaadinIcon) into a static field (or into an enum).

Moving a component from one UI to another will cause the component to disappear from the original UI for no apparent reasons, causing a lot of headscratching for the developer, and therefore this is definitely not a good practice.

A Vaadin ticket 9376 discusses the problem in deeper detail.

What you need to do is:

  • Figure which component is causing this issue (is moved to another UI)
  • Fix scopes for that component.

You can figure out the offending component using debugger; you can even track where the component was created and inserted.

In the future, Vaadin will print this information in the exception message itself.

Valid Case

The valid case of moving a component from one UI to another is when you have a tab scoped component and you reload a page. Upon reload, a new UI instance is constructed, old UI is thrown away, and all components are moved there, causing this error. In this specific case it is allowed to move components from one ui to another.

In this case you’ll need to call getElement().removeFromTree() on the component, to move it correctly from one UI to another. Also see Vaadin UI Scope.

Written on November 22, 2023