Stack overflow with logj after upgrade from 12.0.7 to 13.0.3

I’ve just upgraded a working vaadin project from 12.0.7 to 13.03.

As soon as I start the webapp up I’m getting a stack overflow as below.

Each time I remove what appears to be my offending code the stack overflow moves. So it looks like a problem with the reroute as that is the common thread.

There was an exception while trying to navigate to 'admin/UserList' with the exception message 'Unable to create an instance of 'au.com.noojeeit.micropbx.ui.admin.views.LoginView'. The constructor threw an exception.'
java.lang.IllegalArgumentException: Unable to create an instance of 'au.com.noojeeit.micropbx.ui.admin.views.LoginView'. The constructor threw an exception.
	at com.vaadin.flow.internal.ReflectTools.createProxyInstance(ReflectTools.java:510)
	at com.vaadin.flow.internal.ReflectTools.createInstance(ReflectTools.java:447)
	at com.vaadin.flow.di.DefaultInstantiator.getOrCreate(DefaultInstantiator.java:65)
	at com.vaadin.flow.di.Instantiator.createRouteTarget(Instantiator.java:158)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.lambda$getRouteTarget$1(AbstractNavigationStateRenderer.java:121)
	at java.base/java.util.Optional.orElseGet(Optional.java:369)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.getRouteTarget(AbstractNavigationStateRenderer.java:120)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:178)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	...
	
		at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
Caused by: java.lang.StackOverflowError
	at java.base/java.util.stream.ReferencePipeline.skip(ReferencePipeline.java:480)
	at org.apache.logging.log4j.util.StackLocator.lambda$getCallerClass$7(StackLocator.java:60)
	at java.base/java.lang.StackStreamFactory$StackFrameTraverser.consumeFrames(StackStreamFactory.java:534)
	at java.base/java.lang.StackStreamFactory$AbstractStackWalker.doStackWalk(StackStreamFactory.java:306)
	at java.base/java.lang.StackStreamFactory$AbstractStackWalker.callStackWalk(Native Method)
	at java.base/java.lang.StackStreamFactory$AbstractStackWalker.beginStackWalk(StackStreamFactory.java:370)
	at java.base/java.lang.StackStreamFactory$AbstractStackWalker.walk(StackStreamFactory.java:243)
	at java.base/java.lang.StackWalker.walk(StackWalker.java:498)
	at org.apache.logging.log4j.util.StackLocator.getCallerClass(StackLocator.java:60)
	at org.apache.logging.log4j.util.StackLocatorUtil.getCallerClass(StackLocatorUtil.java:40)
	at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:567)
	at au.com.noojeeit.micropbx.ui.admin.views.LoginView.<init>(LoginView.java:40)
	at jdk.internal.reflect.GeneratedConstructorAccessor200.newInstance(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45005)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at com.vaadin.flow.internal.ReflectTools.createProxyInstance(ReflectTools.java:479)
	at com.vaadin.flow.internal.ReflectTools.createInstance(ReflectTools.java:447)
	at com.vaadin.flow.di.DefaultInstantiator.getOrCreate(DefaultInstantiator.java:65)
	at com.vaadin.flow.di.Instantiator.createRouteTarget(Instantiator.java:158)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.lambda$getRouteTarget$1(AbstractNavigationStateRenderer.java:121)
	at java.base/java.util.Optional.orElseGet(Optional.java:369)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.getRouteTarget(AbstractNavigationStateRenderer.java:120)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:178)



If I take out the lo4j loggers, i get:

	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
Caused by: java.lang.StackOverflowError
	at java.base/com.zeroturnaround.jrebelbase.l._jr$iCur(SourceFile)
	at java.base/com.zeroturnaround.jrebelbase.facade.i.getCurrentVersionInternal(SourceFile:50)
	at java.base/com.zeroturnaround.jrebelbase.facade.i.getCurrentVersion(SourceFile:1)
	at java.base/com.zeroturnaround.jrebelbase.facade.i.getCurrentInstance(SourceFile:42)
	at com.googlecode.gentyref.GenericTypeReflector.erase(GenericTypeReflector.java:31)
	at com.googlecode.gentyref.GenericTypeReflector.getExactSuperType(GenericTypeReflector.java:128)
	at com.googlecode.gentyref.GenericTypeReflector.getTypeParameter(GenericTypeReflector.java:160)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.getType(AbstractServerHandlers.java:223)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.collectHandlerMethods(AbstractServerHandlers.java:150)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.collectHandlerMethods(AbstractServerHandlers.java:156)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.collectHandlerMethods(AbstractServerHandlers.java:156)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.collectHandlerMethods(AbstractServerHandlers.java:156)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.collectHandlerMethods(AbstractServerHandlers.java:156)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.collectHandlerMethods(AbstractServerHandlers.java:156)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.collectHandlerMethods(AbstractServerHandlers.java:121)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.componentSet(AbstractServerHandlers.java:82)
	at com.vaadin.flow.internal.nodefeature.ComponentMapping.setComponent(ComponentMapping.java:63)
	at com.vaadin.flow.dom.ElementStateProvider.setComponent(ElementStateProvider.java:350)
	at com.vaadin.flow.dom.ElementUtil.setComponent(ElementUtil.java:198)
	at com.vaadin.flow.component.Component.setElement(Component.java:217)
	at com.vaadin.flow.component.Component.setElement(Component.java:238)
	at com.vaadin.flow.component.Component.<init>(Component.java:117)
	at com.vaadin.flow.component.AbstractField.<init>(AbstractField.java:145)
	at com.vaadin.flow.component.AbstractSinglePropertyField.<init>(AbstractSinglePropertyField.java:216)
	at com.vaadin.flow.component.AbstractSinglePropertyField.<init>(AbstractSinglePropertyField.java:157)
	at com.vaadin.flow.component.textfield.GeneratedVaadinTextField.<init>(GeneratedVaadinTextField.java:1101)
	at com.vaadin.flow.component.textfield.GeneratedVaadinPasswordField.<init>(GeneratedVaadinPasswordField.java:178)
	at com.vaadin.flow.component.textfield.PasswordField.<init>(PasswordField.java:46)
	at com.vaadin.flow.component.textfield.PasswordField.<init>(PasswordField.java:57)
	at au.com.noojeeit.micropbx.ui.admin.views.LoginView.<init>(LoginView.java:65)
	at jdk.internal.reflect.GeneratedConstructorAccessor220.newInstance(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45005)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at com.vaadin.flow.internal.ReflectTools.createProxyInstance(ReflectTools.java:479)
	at com.vaadin.flow.internal.ReflectTools.createInstance(ReflectTools.java:447)
	at com.vaadin.flow.di.DefaultInstantiator.getOrCreate(DefaultInstantiator.java:65)
	at com.vaadin.flow.di.Instantiator.createRouteTarget(Instantiator.java:158)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.lambda$getRouteTarget$1(AbstractNavigationStateRenderer.java:121)
	at java.base/java.util.Optional.orElseGet(Optional.java:369)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.getRouteTarget(AbstractNavigationStateRenderer.java:120)

here is a another one:

	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
Caused by: java.lang.StackOverflowError
	at java.base/java.lang.reflect.AccessibleObject.isAnnotationPresent(AccessibleObject.java)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.lambda$collectHandlerMethods$1(AbstractServerHandlers.java:154)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
	at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.collectHandlerMethods(AbstractServerHandlers.java:155)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.collectHandlerMethods(AbstractServerHandlers.java:156)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.collectHandlerMethods(AbstractServerHandlers.java:156)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.collectHandlerMethods(AbstractServerHandlers.java:156)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.collectHandlerMethods(AbstractServerHandlers.java:156)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.collectHandlerMethods(AbstractServerHandlers.java:121)
	at com.vaadin.flow.internal.nodefeature.AbstractServerHandlers.componentSet(AbstractServerHandlers.java:82)
	at com.vaadin.flow.internal.nodefeature.ComponentMapping.setComponent(ComponentMapping.java:63)
	at com.vaadin.flow.dom.ElementStateProvider.setComponent(ElementStateProvider.java:350)
	at com.vaadin.flow.dom.ElementUtil.setComponent(ElementUtil.java:198)
	at com.vaadin.flow.component.Component.setElement(Component.java:217)
	at com.vaadin.flow.component.Component.setElement(Component.java:238)
	at com.vaadin.flow.component.Component.<init>(Component.java:117)
	at com.vaadin.flow.component.AbstractField.<init>(AbstractField.java:145)
	at com.vaadin.flow.component.AbstractSinglePropertyField.<init>(AbstractSinglePropertyField.java:216)
	at com.vaadin.flow.component.AbstractSinglePropertyField.<init>(AbstractSinglePropertyField.java:157)
	at com.vaadin.flow.component.textfield.GeneratedVaadinTextField.<init>(GeneratedVaadinTextField.java:1101)
	at com.vaadin.flow.component.textfield.GeneratedVaadinPasswordField.<init>(GeneratedVaadinPasswordField.java:178)
	at com.vaadin.flow.component.textfield.PasswordField.<init>(PasswordField.java:46)
	at com.vaadin.flow.component.textfield.PasswordField.<init>(PasswordField.java:57)
	at au.com.noojeeit.micropbx.ui.admin.views.LoginView.<init>(LoginView.java:65)
	at jdk.internal.reflect.GeneratedConstructorAccessor203.newInstance(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45005)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at com.vaadin.flow.internal.ReflectTools.createProxyInstance(ReflectTools.java:479)
	at com.vaadin.flow.internal.ReflectTools.createInstance(ReflectTools.java:447)
	at com.vaadin.flow.di.DefaultInstantiator.getOrCreate(DefaultInstantiator.java:65)
	at com.vaadin.flow.di.Instantiator.createRouteTarget(Instantiator.java:158)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.lambda$getRouteTarget$1(AbstractNavigationStateRenderer.java:121)
	at java.base/java.util.Optional.orElseGet(Optional.java:369)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.getRouteTarget(AbstractNavigationStateRenderer.java:120)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:178)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:385)
	at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:218)

So I’ve ran a couple of experiements.

My app has two ‘parent layouts’, one for admin users and one for end users.

The LoginView in the trace above was using the admin view:

@Route(value="", layout = MainAdminLayout.class)

I have another view:

@Route(value="", layout = MainLayout.class)

If I changed the Login view to

@Route(value="Login")

then the problem goes away.

This code has been working fine in 12.0.7

So another experiment.

I change the LoginView to

@Route(value="MyLogin", layout=MainAdminLayout.class)

And my app starts again.

So it looks like you can’t have two default routes (value =“”) under 13.

Is this correct?

Problem solved.

It looks like it was my code causing the problem.
I had an observer for my login page which if the user wasn’t logged in it would send them to the login page.

The problem was that when sending them to the login page a bug caused my code to send them to the login page, stack overflow ensured.

I’m still confused as to why this bug only got triggered after a 12-13 upgrade, but will leave that for another day.