UnsupportedOperationException Being Thrown when Second user Logs In

I’m not sure what I am doing wrong, but it appears as though my Vaadin application cannot handle more than 1 user at a time. I keep getting the following exception once a second user tries logging in:



javax.servlet.ServletException: java.lang.UnsupportedOperationException
	com.vaadin.terminal.gwt.server.AbstractApplicationServlet.handleServiceException(AbstractApplicationServlet.java:999)
	com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:548)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
root cause

java.lang.UnsupportedOperationException
	com.vaadin.ui.CustomComponent.removeComponent(CustomComponent.java:248)
	com.vaadin.ui.AbstractComponentContainer.addComponent(AbstractComponentContainer.java:207)
	com.vaadin.ui.CustomComponent.setCompositionRoot(CustomComponent.java:113)
	org.vaadin.appfoundation.view.AbstractView.setContent(AbstractView.java:34)
	org.vaadin.appfoundation.view.AbstractView.<init>(AbstractView.java:22)
	com.paymentzen.ui.view.RegPanelPendingView.<init>(RegPanelPendingView.java:14)
	sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	java.lang.Class.newInstance0(Class.java:355)
	java.lang.Class.newInstance(Class.java:308)
	org.vaadin.appfoundation.view.DefaultViewFactory.initView(DefaultViewFactory.java:22)
	org.vaadin.appfoundation.view.ViewItem.getView(ViewItem.java:67)
	org.vaadin.appfoundation.view.ViewHandler.activateView(ViewHandler.java:243)
	org.vaadin.appfoundation.view.ViewHandler.activateView(ViewHandler.java:205)
	com.paymentzen.ui.web.PaymentZenUIApplication.handleParameters(PaymentZenUIApplication.java:153)
	com.vaadin.ui.Window.handleParameters(Window.java:502)
	com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:528)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

The code that it is executing when getting the error is the super(mainLayout) of the following snippet:


public class RegPanelPendingView extends AbstractView<AbsoluteLayout> {

	private static final long serialVersionUID = -3644738281248436114L;
	private static AbsoluteLayout mainLayout;

	public RegPanelPendingView() {
		super(mainLayout);
		buildMainLayout();
		setCompositionRoot(mainLayout);
	}

I am using the ViewHandler pattern, so I don’t know if that has anything to do with it. What I do, is in the init of my Application class, I do:

ViewHandler.addView(myPanel.class, this);

Where this is my application class:

Then, I use the handleParameters method to choose the proper screen based on the parameters in the URL:



	public void handleParameters(Map<String, String[]> parameters) {
		do {
			if (parameters.size() == 0)
				break;
                       .......
			ViewHandler.activateView(RegPanelPendingView.class, payee);
		} while (false);
	}

The ViewHandler.activateView(RegPanelPendingView.class,payee) is what is throwing the exception. It appears as though there is something I don’t understand about the ViewHandler pattern that may be causing this problem.

The init in my program:



public class PaymentZenUIApplication extends Application implements
		ParameterHandler, ViewContainer {

	@Autowired(required=true)
	private AddressDataService addressDataService = null;

	private static final long serialVersionUID = 1164965093900283124L;
	private AbstractView<?> currentView = null;
	private VerticalLayout mainLayout = new VerticalLayout();

	@Override
	public void init() {
		getContext().addTransactionListener(new ViewHandler(this));
		SpringContextHelper springHelper = new SpringContextHelper(this);
		
		Window mainWindow = new Window("MYNAME");
		mainWindow.getContent().setSizeFull();
		mainLayout.setSizeFull();
		// select window theme

		mainWindow.addParameterHandler(this);
		mainWindow.addComponent(mainLayout);

		// Register child views
		ViewHandler.addView(RegPanelPendingView.class.class, this);
                ....

Any assistance would be great. I am trying to test this with customers and I don’t understand what is going on.

Thanks,
Tom

Hi,

You really should not use static fields in Vaadin applications unless you really mean to. A static field is
shared between all users
, which is most probably not what you want and what is causing your problems.

Removing the “static” modifier from your mainLayout should fix your problem.

HTH,
/Jonatan

Thank you - that was it.