0

As the title states, I'm trying to use Whiteboard to host my VaadinServlet. After many failed attempts at using other embedded servlet containers such as Jetty and Grizzly, I came across this solution here, written by the Bndtools man himself, Peter. I've tried implementing this myself, but I'm getting an error I cannot solve myself:

[test.client.ui.ClientUI$ClientServlet(4)] Error during instantiation of the implementation object
java.lang.InstantiationException: test.client.ui.ClientUI$ClientServlet: test.client.ui.ClientUI$ClientServlet.<init>()
Caused by: org.apache.felix.log.LogException: java.lang.InstantiationException: test.client.ui.ClientUI$ClientServlet
    at java.lang.Class.newInstance(Class.java:427)
    at org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:253)
    at org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:127)
    at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:871)
    at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:838)
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:850)
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:419)
    at org.apache.felix.scr.impl.config.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:376)
    at org.apache.felix.scr.impl.BundleComponentActivator.initialize(BundleComponentActivator.java:172)
    at org.apache.felix.scr.impl.BundleComponentActivator.<init>(BundleComponentActivator.java:120)
    at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:258)
    at org.apache.felix.scr.impl.Activator.access$000(Activator.java:45)
    at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:185)
    at org.apache.felix.utils.extender.AbstractExtender.createExtension(AbstractExtender.java:259)
    at org.apache.felix.utils.extender.AbstractExtender.modifiedBundle(AbstractExtender.java:232)
    ... 17 more
Caused by: java.lang.NoSuchMethodException: test.client.ui.ClientUI$ClientServlet.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.newInstance(Class.java:412)
    at org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:253)
    at org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:127)
    at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:871)
    at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:838)
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:850)
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:419)
    at org.apache.felix.scr.impl.config.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:376)
    at org.apache.felix.scr.impl.BundleComponentActivator.initialize(BundleComponentActivator.java:172)
    at org.apache.felix.scr.impl.BundleComponentActivator.<init>(BundleComponentActivator.java:120)
    at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:258)
    at org.apache.felix.scr.impl.Activator.access$000(Activator.java:45)
    at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:185)
    at org.apache.felix.utils.extender.AbstractExtender.createExtension(AbstractExtender.java:259)
    ... 18 more

I added empty constructors just for the hell of it to see if they changed anything but nope.

ClientUI and ClientServlet classes:

public class ClientUI extends UI
{
    public ClientUI()
    {
        //Empty constructor.
    }

    @Override
    public void init(VaadinRequest request) 
    {
        //Typical UI initialization.
    }
}

@VaadinServletConfiguration(productionMode = false, ui = ClientUI.class)
@Component(provide = Servlet.class, properties = {"alias=/test"}, immediate = true)
public class ClientServlet extends VaadinServlet 
{
    // Empty class. This class uses the annotations for servlet configuration instead of a web.xml.

    public ClientServlet()
    {
        // Empty constructor.
    }
}

Any idea on how to stop this error and get the servlet up and running?

Edit: New error! Steffen, who commented below, pointed out I may have needed to move the servlet class to a top-level class, in which I most likely did need to, but now I get this:

org.osgi.framework.ServiceException: Service cannot be cast: javax.servlet.Servlet
Caused by: org.apache.felix.log.LogException: org.osgi.framework.ServiceException: Service cannot be cast: javax.servlet.Servlet
    at org.apache.felix.framework.ServiceRegistrationImpl.getFactoryUnchecked(ServiceRegistrationImpl.java:344)
    at org.apache.felix.framework.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:231)
    at org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:327)
    at org.apache.felix.framework.Felix.getService(Felix.java:3574)
    at org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:468)
    at org.osgi.util.tracker.ServiceTracker.addingService(ServiceTracker.java:411)
    at org.apache.felix.http.whiteboard.internal.tracker.AbstractTracker.addingService(AbstractTracker.java:35)
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:932)
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:864)
    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:894)
    at org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:943)
    at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:794)
    at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:544)
    ... 12 more

Also, this question may eventually be deleted. I'm looking at this Vaadin/OSGi EnRoute example that does what I need and I have confirmed that it works. I may just use the example provider and API for an application or create something similar. I will leave this question up for now just to provide to the knowledge of the internet and see if anyone can answer!

Community
  • 1
  • 1
Karijuana
  • 314
  • 1
  • 2
  • 13
  • 1
    You could try to move `ClientServlet` to top-level class or make it static. Dunno if it changes then. – Steffen Harbich Sep 19 '16 at 11:10
  • Maybe related: http://stackoverflow.com/questions/17485297/how-to-instantiate-inner-class-with-reflection-in-java – Steffen Harbich Sep 19 '16 at 11:14
  • I believe I did have to make it static or move it to a top-level class, that came to my mind last week and totally forgot to try it before I left for the weekend. The original error is now gone but I have a new one I'll edit into my question above. Thanks! :) – Karijuana Sep 19 '16 at 14:31
  • Could you update your experiences after doing the OSGi enRoute Vaadin example? – Peter Kriens Sep 26 '16 at 08:29
  • @PeterKriens I absolutely will! I'm currently on mobile so I'll update tonight or tomorrow. I'll also say that as a whole, all the new enRoute stuff is amazing. I've also played around with REST/Angular using enRoute and I love the way it works. Keep it up! – Karijuana Oct 02 '16 at 22:01

0 Answers0