Использование Felix/Whiteboard для размещения VaadinServlet

Как следует из названия, я пытаюсь использовать доску для размещения моего VaadinServlet. После многих неудачных попыток использования других встроенных контейнеров сервлетов, таких как Jetty и Grizzly, я наткнулся на это решение, написанное самим сотрудником Bndtools Питером. Я пытался реализовать это сам, но получаю ошибку, которую не могу решить сам:

[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

Я добавил пустые конструкторы просто для того, чтобы увидеть, изменились ли они что-нибудь, кроме "нет".

Классы ClientUI и ClientServlet:

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.
    }
}

Любая идея о том, как остановить эту ошибку и запустить сервлет?

Изменить: Новая ошибка! Штеффен, который прокомментировал ниже, указал, что мне, возможно, нужно было переместить класс сервлета в класс верхнего уровня, в котором я, скорее всего, действительно нуждался, но теперь я получаю это:

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

Кроме того, этот вопрос может быть в конечном итоге удален. Я смотрю на этот пример Vaadin/OSGi EnRoute, который делает то, что мне нужно, и я подтвердил, что он работает. Я могу просто использовать пример провайдера и API для приложения или создать нечто подобное. Я оставлю этот вопрос пока только для того, чтобы ознакомить его с интернетом и посмотреть, сможет ли кто-нибудь ответить!

0 ответов

Другие вопросы по тегам