Migate from Vaadin 10 to Vaadin 12 and deploy n external Tomcat 8.5

Hi,
I actually have an application coded in Vaadin 10 using Spring Boot and Maven. This application is exported as a war and deployed on a Tomcat 8.5. Everything works fine.
When I try to update the application to Vaadin 12 (using the pom.xml), everything is running fine in the embedded tomcat. But when I export the war and deploy it to the same Tomcat 8.5 I have the following error :

2019-01-29 00:38:18.729 ERROR 3620 --- [o-8009-exec-348]
 o.s.b.w.servlet.support.ErrorPageFilter  : Forwarding to error page from request 
[/frontend/styles/shared-styles.html] due to exception [com.vaadin.flow.server.ServiceException: java.lang.IllegalArgumentException: Unable to create an instance of 'MyClass'. Make sure the class has a public no-arg constructor.]


javax.servlet.ServletException: com.vaadin.flow.server.ServiceException: java.lang.IllegalArgumentException: Unable to create an instance of 'MyClass'. Make sure the class has a public no-arg constructor.
        at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:229) ~[flow-server-1.2.4.jar:1.2.4]

        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[servlet-api.jar:na]

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:8.5.35]

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.35]

        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-websocket.jar:8.5.35]

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.35]

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.35]

        at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:209) ~[spring-security-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]

        at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) ~[spring-security-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]

        at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357) ~[spring-web-5.0.10.RELEASE.jar:5.0.10.RELEASE]

        at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270) ~[spring-web-5.0.10.RELEASE.jar:5.0.10.RELEASE]

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.35]

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.35]

        at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) ~[spring-web-5.0.10.RELEASE.jar:5.0.10.RELEASE]

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.10.RELEASE.jar:5.0.10.RELEASE]

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.35]

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.35]

        at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) ~[spring-web-5.0.10.RELEASE.jar:5.0.10.RELEASE]

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.10.RELEASE.jar:5.0.10.RELEASE]

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.35]

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.35]

        at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:130) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]

        at org.springframework.boot.web.servlet.support.ErrorPageFilter.access$000(ErrorPageFilter.java:66) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]

        at org.springframework.boot.web.servlet.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:105) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.10.RELEASE.jar:5.0.10.RELEASE]

        at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:123) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.35]

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.35]

        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) [spring-web-5.0.10.RELEASE.jar:5.0.10.RELEASE]

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.10.RELEASE.jar:5.0.10.RELEASE]

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.35]

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.35]

        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [catalina.jar:8.5.35]

        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:8.5.35]

        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493) [catalina.jar:8.5.35]

        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [catalina.jar:8.5.35]

        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [catalina.jar:8.5.35]

        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) [catalina.jar:8.5.35]

        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [catalina.jar:8.5.35]

        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [catalina.jar:8.5.35]

        at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:479) [tomcat-coyote.jar:8.5.35]

        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:8.5.35]

        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806) [tomcat-coyote.jar:8.5.35]

        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) [tomcat-coyote.jar:8.5.35]

        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:8.5.35]

        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191]

        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191]

        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.5.35]

        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]

Caused by: com.vaadin.flow.server.ServiceException: java.lang.IllegalArgumentException: Unable to create an instance of 'MyClass'. Make sure the class has a public no-arg constructor.
        at com.vaadin.flow.server.VaadinService.handleExceptionDuringRequest(VaadinService.java:1594) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1557) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:227) ~[flow-server-1.2.4.jar:1.2.4]

        ... 48 common frames omitted
Caused by: java.lang.IllegalArgumentException: Unable to create an instance of 'MyClass'. Make sure the class has a public no-arg constructor.
        at com.vaadin.flow.internal.ReflectTools.createProxyInstance(ReflectTools.java:515) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.internal.ReflectTools.createInstance(ReflectTools.java:447) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.di.DefaultInstantiator.getOrCreate(DefaultInstantiator.java:65) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.di.Instantiator.createRouteTarget(Instantiator.java:158) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.lambda$getRouteTarget$1(AbstractNavigationStateRenderer.java:116) ~[flow-server-1.2.4.jar:1.2.4]

        at java.util.Optional.orElseGet(Optional.java:267) ~[na:1.8.0_191]

        at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.getRouteTarget(AbstractNavigationStateRenderer.java:115) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:167) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.reroute(AbstractNavigationStateRenderer.java:345) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:185) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.router.internal.ErrorStateRenderer.handle(ErrorStateRenderer.java:49) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.router.Router.handleExceptionNavigation(Router.java:259) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.router.Router.navigate(Router.java:194) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.router.Router.initializeUI(Router.java:95) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.server.BootstrapHandler.createAndInitUI(BootstrapHandler.java:1117) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.server.BootstrapHandler.synchronizedHandleRequest(BootstrapHandler.java:396) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40) ~[flow-server-1.2.4.jar:1.2.4]

        at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1545) ~[flow-server-1.2.4.jar:1.2.4]


So, that’s true : MyClass (not the real name) has no public no-arg constructor, but it works well in the embedded Tomcat and also works using Vaadin 10.

So I don’t understand, is there anything else to do to use Vaadin 12 war in external Tomcat 8.5 ?

Thanks for your help.

Greg.

Nobody tries to export on Tomcat a Vaadin 12 project ?
It seems that the demo bakery project has the same issues.
Is there a way to get some support ?

This worked for me [forum]
(https://vaadin.com/forum/thread/17168149/autowire-by-constructor-fails)

Application.java has to extend SpringBootServletInitializer:

public class Application extends SpringBootServletInitializer {
 // ...
}

Gregory, I haven’t experienced that issue. I run locally with spring-boot:run snd deploy externally using wars to tomcat 8.5.

Can you shared how you class is being used? My gut instinct is old classes in build path or perhaps POM issues. But its really hard to tell from the stacktrace.