vaadin/base-starter-flow-osgi

NullPointerException in Vaadin 14 when trying to start with karaf

Closed this issue · 11 comments

When trying to run inside karaf (4.3.7) Vaadin 14.9.8 throws a NullPointerException.

How to reproduce

Build the base started project for the v14 branch. Start karaf and install the test feature from the TestRepository
`bin/karaf

feature:repo-add file:/path-to-xml
feature:install test`

features.xml:

`
mvn:org.apache.karaf.features/framework/4.3.7/xml/features
mvn:org.apache.karaf.features/specs/4.3.7/xml/features

http http-whiteboard mvn:org.jsoup/jsoup/1.15.3 spifly mvn:com.helger/ph-commons/9.1.2 mvn:com.helger/ph-css/6.1.1 mvn:net.bytebuddy/byte-buddy/1.12.19 mvn:commons-fileupload/commons-fileupload/1.5 mvn:com.vaadin.external.atmosphere/atmosphere-runtime/2.4.30.slf4jvaadin1 mvn:com.vaadin.external/gentyref/1.2.0.vaadin1 mvn:com.vaadin/flow-client/2.8.7 mvn:com.vaadin/flow-data/2.8.7 mvn:com.vaadin/flow-dnd/2.8.7 mvn:com.vaadin/flow-html-components/2.8.7 mvn:com.vaadin/flow-osgi/2.8.7 mvn:com.vaadin/flow-push/2.8.7 mvn:com.vaadin/flow-server/2.8.7 mvn:com.vaadin/vaadin-lumo-theme/2.8.7 mvn:com.vaadin/vaadin-material-theme/2.8.7 mvn:com.vaadin/vaadin-accordion-flow/14.9.8 mvn:com.vaadin/vaadin-app-layout-flow/14.9.8 mvn:com.vaadin/vaadin-button-flow/14.9.8 mvn:com.vaadin/vaadin-checkbox-flow/14.9.8 mvn:com.vaadin/vaadin-combo-box-flow/14.9.8 mvn:com.vaadin/vaadin-context-menu-flow/14.9.8 mvn:com.vaadin/vaadin-custom-field-flow/14.9.8 mvn:com.vaadin/vaadin-date-picker-flow/14.9.8 mvn:com.vaadin/vaadin-date-time-picker-flow/14.9.8 mvn:com.vaadin/vaadin-details-flow/14.9.8 mvn:com.vaadin/vaadin-dialog-flow/14.9.8 mvn:com.vaadin/vaadin-form-layout-flow/14.9.8 mvn:com.vaadin/vaadin-grid-flow/14.9.8 mvn:com.vaadin/vaadin-icons-flow/14.9.8 mvn:com.vaadin/vaadin-iron-list-flow/14.9.8 mvn:com.vaadin/vaadin-list-box-flow/14.9.8 mvn:com.vaadin/vaadin-login-flow/14.9.8 mvn:com.vaadin/vaadin-menu-bar-flow/14.9.8 mvn:com.vaadin/vaadin-notification-flow/14.9.8 mvn:com.vaadin/vaadin-ordered-layout-flow/14.9.8 mvn:com.vaadin/vaadin-progress-bar-flow/14.9.8 mvn:com.vaadin/vaadin-radio-button-flow/14.9.8 mvn:com.vaadin/vaadin-select-flow/14.9.8 mvn:com.vaadin/vaadin-split-layout-flow/14.9.8 mvn:com.vaadin/vaadin-tabs-flow/14.9.8 mvn:com.vaadin/vaadin-text-field-flow/14.9.8 mvn:com.vaadin/vaadin-time-picker-flow/14.9.8 mvn:com.vaadin/vaadin-upload-flow/14.9.8 mvn:com.vaadin.external.gwt/gwt-elemental/2.8.2.vaadin2 mvn:com.vaadin.external.slf4j/vaadin-slf4j-jdk14/1.6.1 mvn:com.vaadin/license-checker/1.12.3 mvn:com.nimbusds/nimbus-jose-jwt/9.31 mvn:org.lucee/jcip-annotations/1.0.0 mvn:com.vaadin/open/8.5.0 eventadmin scr apache-http-components apache-commons vaadin webconsole mvn:com.example/project-base-osgi/1.0-SNAPSHOT mvn:org.apache.httpcomponents/httpclient-osgi/4.5.13 mvn:org.apache.httpcomponents/httpcore-osgi/4.4.14 mvn:commons-lang/commons-lang/2.6 mvn:commons-net/commons-net/2.2 mvn:commons-io/commons-io/2.11.0 mvn:org.apache.commons/commons-lang3/3.12.0 mvn:org.apache.commons/commons-collections4/4.4 mvn:org.apache.commons/commons-math3/3.6.1 mvn:org.apache.commons/commons-compress/1.21 mvn:org.apache.commons/commons-text/1.9 mvn:commons-codec/commons-codec/1.10 `

All bundles start. But the base starter bundle throws an exception when it tries to initialize the servlet.

Caused by: java.lang.NullPointerException at com.vaadin.flow.server.DeploymentConfigurationFactory.getTokenFileFromClassloader(DeploymentConfigurationFactory.java:359) at com.vaadin.flow.server.DeploymentConfigurationFactory.getTokenFileContents(DeploymentConfigurationFactory.java:329) at com.vaadin.flow.server.DeploymentConfigurationFactory.readBuildInfo(DeploymentConfigurationFactory.java:184) at com.vaadin.flow.server.DeploymentConfigurationFactory.createInitParameters(DeploymentConfigurationFactory.java:177) at com.vaadin.flow.server.VaadinServlet.createDeploymentConfiguration(VaadinServlet.java:152) at com.vaadin.flow.server.VaadinServlet.createServletService(VaadinServlet.java:190) at com.vaadin.flow.server.VaadinServlet.init(VaadinServlet.java:77) at com.example.starter.base.osgi.VaadinServletRegistration$FixedVaadinServlet.init(VaadinServletRegistration.java:31) at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:632) ... 76 more

Full StackTrace:

java.lang.RuntimeException: javax.servlet.ServletException: org.ops4j.pax.web.service.spi.model.ServletModel-56==com.example.starter.base.osgi.VaadinServletRegistration$FixedVaadinServlet@b9f03ed9{jsp=null,order=-1,inst=true,async=true,src=EMBEDDED:null,STARTED} at org.eclipse.jetty.servlet.ServletHandler.initializeHolders(ServletHandler.java:785) at org.eclipse.jetty.servlet.ServletHandler.setServlets(ServletHandler.java:1531) at org.eclipse.jetty.servlet.ServletHandler.addServlet(ServletHandler.java:913) at org.ops4j.pax.web.service.jetty.internal.JettyServerImpl$2.call(JettyServerImpl.java:425) at org.ops4j.pax.web.service.jetty.internal.JettyServerImpl$2.call(JettyServerImpl.java:421) at org.ops4j.pax.swissbox.core.ContextClassLoaderUtils.doWithClassLoader(ContextClassLoaderUtils.java:60) at org.ops4j.pax.web.service.jetty.internal.JettyServerImpl.addServlet(JettyServerImpl.java:420) at org.ops4j.pax.web.service.jetty.internal.ServerControllerImpl$Started.addServlet(ServerControllerImpl.java:317) at org.ops4j.pax.web.service.jetty.internal.ServerControllerImpl.addServlet(ServerControllerImpl.java:122) at org.ops4j.pax.web.service.internal.HttpServiceStarted.registerServlet(HttpServiceStarted.java:250) at org.ops4j.pax.web.service.internal.HttpServiceStarted.registerServlet(HttpServiceStarted.java:395) at org.ops4j.pax.web.service.internal.HttpServiceProxy.registerServlet(HttpServiceProxy.java:504) at org.ops4j.pax.web.extender.whiteboard.internal.element.ServletWebElement.register(ServletWebElement.java:102) at org.ops4j.pax.web.extender.whiteboard.internal.WebApplication.registerWebElement(WebApplication.java:392) at org.ops4j.pax.web.extender.whiteboard.internal.WebApplication.addWebElement(WebApplication.java:188) at org.ops4j.pax.web.extender.whiteboard.internal.tracker.AbstractTracker.addingService(AbstractTracker.java:191) at org.ops4j.pax.web.extender.whiteboard.internal.tracker.AbstractTracker.addingService(AbstractTracker.java:44) at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:943) at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:871) at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256) at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:903) at org.apache.felix.framework.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:990) at org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:838) at org.apache.felix.framework.EventDispatcher.fireServiceEvent(EventDispatcher.java:545) at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4833) at org.apache.felix.framework.Felix.registerService(Felix.java:3804) at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:328) at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:335) at com.example.starter.base.osgi.VaadinServletRegistration.activate(VaadinServletRegistration.java:55) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.apache.felix.scr.impl.inject.methods.BaseMethod.invokeMethod(BaseMethod.java:244) at org.apache.felix.scr.impl.inject.methods.BaseMethod.access$500(BaseMethod.java:41) at org.apache.felix.scr.impl.inject.methods.BaseMethod$Resolved.invoke(BaseMethod.java:685) at org.apache.felix.scr.impl.inject.methods.BaseMethod.invoke(BaseMethod.java:529) at org.apache.felix.scr.impl.inject.methods.ActivateMethod.invoke(ActivateMethod.java:318) at org.apache.felix.scr.impl.inject.methods.ActivateMethod.invoke(ActivateMethod.java:308) at org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:354) at org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:115) at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:1000) at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:973) at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:785) at org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:674) at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:437) at org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:667) at org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:305) at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:554) at org.apache.felix.scr.impl.Activator.access$200(Activator.java:70) at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:421) at org.apache.felix.scr.impl.AbstractExtender.createExtension(AbstractExtender.java:196) at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:169) at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:49) at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:488) at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:420) at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232) at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:450) at org.apache.felix.framework.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:915) at org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:834) at org.apache.felix.framework.EventDispatcher.fireBundleEvent(EventDispatcher.java:516) at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4817) at org.apache.felix.framework.Felix.startBundle(Felix.java:2336) at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998) at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984) at org.apache.karaf.features.internal.service.BundleInstallSupportImpl.startBundle(BundleInstallSupportImpl.java:165) at org.apache.karaf.features.internal.service.FeaturesServiceImpl.startBundle(FeaturesServiceImpl.java:1160) at org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:1041) at org.apache.karaf.features.internal.service.FeaturesServiceImpl.doProvision(FeaturesServiceImpl.java:1069) at org.apache.karaf.features.internal.service.FeaturesServiceImpl.lambda$doProvisionInThread$13(FeaturesServiceImpl.java:1004) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: javax.servlet.ServletException: org.ops4j.pax.web.service.spi.model.ServletModel-56==com.example.starter.base.osgi.VaadinServletRegistration$FixedVaadinServlet@b9f03ed9{jsp=null,order=-1,inst=true,async=true,src=EMBEDDED:null,STARTED} at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:650) at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:415) at org.eclipse.jetty.servlet.ServletHandler.initializeHolders(ServletHandler.java:780) ... 74 more Caused by: java.lang.NullPointerException at com.vaadin.flow.server.DeploymentConfigurationFactory.getTokenFileFromClassloader(DeploymentConfigurationFactory.java:359) at com.vaadin.flow.server.DeploymentConfigurationFactory.getTokenFileContents(DeploymentConfigurationFactory.java:329) at com.vaadin.flow.server.DeploymentConfigurationFactory.readBuildInfo(DeploymentConfigurationFactory.java:184) at com.vaadin.flow.server.DeploymentConfigurationFactory.createInitParameters(DeploymentConfigurationFactory.java:177) at com.vaadin.flow.server.VaadinServlet.createDeploymentConfiguration(VaadinServlet.java:152) at com.vaadin.flow.server.VaadinServlet.createServletService(VaadinServlet.java:190) at com.vaadin.flow.server.VaadinServlet.init(VaadinServlet.java:77) at com.example.starter.base.osgi.VaadinServletRegistration$FixedVaadinServlet.init(VaadinServletRegistration.java:31) at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:632) ... 76 more

tltv commented

@GMMStraider Thank you for reporting. Could you please provide this mentioned TestRepository or some simplified version of the failing test case to help us reproducing the issue?
Public Vaadin Karaf examples/tests seems to be for newer versions only (Vaadin 22+ / Flow 9.0+). Error could be a bug with Karaf and Vaadin 14 or maybe a missing bundle.

@tltv Hi, I have created a test project for the issue https://github.com/GMMStraider/vaadin-osgi-karaf-test
I have vaadin running in our project in the version 14.5.5 (The bundles/build is very similar. And there are no additional bundles there for vaadin). But I have not gotten it to run with any Vaadin 14 version later than that.

tltv commented

Meanwhile before fix is ready, workaround is to override FixedVaadinServlet#init() in VaadinServletRegistration:

import com.vaadin.flow.di.Lookup;
import com.vaadin.flow.server.osgi.OSGiAccess;
...
@Override
public void init() {
	super.init();
	if(getServletConfig().getServletContext().getAttribute(Lookup.class.getName()) == null) {
		getServletConfig().getServletContext().setAttribute(Lookup.class.getName(),
			OSGiAccess.getInstance().getOsgiServletContext().getAttribute(Lookup.class.getName()));
	}
}

The workaround works. Unfortunately I then come to a new problem when I also try to enable push.

I will see if I can find information about the issue when I have some more time.

Error Message:

javax.servlet.ServletException: javax.servlet.ServletException: com.vaadin.flow.server.ServiceException: java.lang.IllegalStateException: Push is not available. See previous log messages for more information. at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:98) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) at org.eclipse.jetty.server.Server.handle(Server.java:516) at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487) at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: javax.servlet.ServletException: com.vaadin.flow.server.ServiceException: java.lang.IllegalStateException: Push is not available. See previous log messages for more information. at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:254) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1631) at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:292) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:548) at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:74) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:600) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440) at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:294) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:90) ... 17 more Caused by: com.vaadin.flow.server.ServiceException: java.lang.IllegalStateException: Push is not available. See previous log messages for more information. at com.vaadin.flow.server.VaadinService.handleExceptionDuringRequest(VaadinService.java:1629) at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1592) at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:252) ... 40 more Caused by: java.lang.IllegalStateException: Push is not available. See previous log messages for more information. at com.vaadin.flow.component.PushConfigurationImpl.setPushMode(PushConfiguration.java:217) at com.vaadin.flow.server.BootstrapHandler.createAndInitUI(BootstrapHandler.java:1665) at com.vaadin.flow.server.BootstrapHandler.synchronizedHandleRequest(BootstrapHandler.java:511) at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40) at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1580) ... 41 more

I noticed I had an older version of atmosphere version in the features. But updating the version to 2.7.3.slf4jvaadin4 has unfortunately not fixed the issue.

But I am now also getting a warning in the log:

================================================================= Atmosphere could not be loaded. When using push with Vaadin, the Atmosphere framework must be present on the classpath. If using a dependency management system, please add a dependency to vaadin-push. If managing dependencies manually, please make sure Atmosphere 2.7.3.slf4jvaadin4 is included on the classpath. Will fall back to using PushMode.DISABLED. =================================================================

The atmosphere bundle is installed, active and has the correct exports. From that side everything should be working as expected.

tltv commented

Did Push work before with 14.5.5?

Did Push work before with 14.5.5?

Yes. I have vaadin with push working in karaf with version 14.5.5

tltv commented

I'm running with Karaf 4.3.9 and push seems to be working in Long polling transport mode. You can try it e.g. with @Push(transport = Transport.LONG_POLLING).

Swapping to long polling did not change anything.

tltv commented

I do get the same Push is not available. error but only with the old atmosphere 2.4.30.slf4jvaadin1 version in my feature.xml.
I tested now also with Karaf 4.3.7 with Push enabled and Long polling works as long as I have atmosphere-runtime 2.7.3.slf4jvaadin4.

Websocket transport mode is not working and log has errors about that like IllegalStateException: Unable to configure jsr356 at that stage. Vaadin Push will fallback automatically to Long polling which should work. But this was actually expected as its know issue with OSGi and Vaadin Push: vaadin/osgi#64

I found the issue on my side! I had the build slightly wrong. Long polling should work fine for our project. I will try it out. Thanks!