Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[jersey-dev] Register Extension as Factory to provide per Request instances

Hi,

before I dive into our problem some context could be useful. We are implementing the OSGi JaxRS Whiteboard Specification (https://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.jaxrs.html) based on Jersey (currently 2.32). OSGi gives us the possibility to dynamically register Resources and Extensions as Services. The Whiteboard receives them as they appear and reconfigures and reloads JaxRs Applications as they come and go.

An Extension is e.g. a MessageBodyReader.

OSGi services come roughly in 2 shapes: Singletons and Prototyped. Singletons are in general no issue. For Prototypes OSGi provides the instances for us and we can register Resources and Extension via the Application.getClasses()  and add a binder with the org.glassfish.hk2.api.Factory.

We have one general Binder that looks as follows:

public class PrototypeServiceBinder extends AbstractBinder {

    private final Map<Class<?>, Factory<?>> factoryMap = new HashMap<>();

    /* (non-Javadoc)
     * @see org.glassfish.hk2.utilities.binding.AbstractBinder#configure()
     */
    @Override
    protected void configure() {
        // bind factories in two different scopes
        factoryMap.forEach((K,V)->{
            bindFactory(V).to(K).in(RequestScoped.class);
            bindFactory(V).to(K).in(PerLookup.class);
        });
    }

The PerLookup might be a bit overkill, but this is another topic. For Resources this, works like a charm. For extensions it always dies on init or reload with java.lang.IllegalStateException: Not inside a request scope (The full Exception is at the bottom of the Mail). A breakpoint at this point told me, that HK2 is currently handling the ActiveDescriptor of my Extension. I also tried to annotate the Extension with RequestScoped or PerLookup but the result is always the same.

Is there something special about Extensions we are missing? I couldn't really find something in the jersey docu and JaxRs Spec regarding scopes and extensions.

Thanks heaps,

Jürgen.


The Full Exception:

A MultiException has 1 exceptions.  They are:|1. java.lang.IllegalStateException: Not inside a request scope.|
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2108)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:758)     at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:721)     at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:691)     at org.glassfish.jersey.inject.hk2.AbstractHk2InjectionManager.getInstance(AbstractHk2InjectionManager.java:160)     at org.glassfish.jersey.inject.hk2.ImmediateHk2InjectionManager.getInstance(ImmediateHk2InjectionManager.java:30)     at org.glassfish.jersey.internal.inject.ProviderBinder.bindProvider(ProviderBinder.java:76)     at org.glassfish.jersey.server.ResourceModelConfigurator.bindProvidersAndResources(ResourceModelConfigurator.java:165)     at org.glassfish.jersey.server.ResourceModelConfigurator.init(ResourceModelConfigurator.java:63)     at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:342)     at org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$1(ApplicationHandler.java:293)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:232)     at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:292)     at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:259)     at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)     at org.glassfish.jersey.servlet.ServletContainer.reload(ServletContainer.java:659)     at org.gecko.rest.jersey.runtime.servlet.WhiteboardServletContainer.reload(WhiteboardServletContainer.java:99)     at org.gecko.rest.jersey.runtime.servlet.WhiteboardServletContainer.init(WhiteboardServletContainer.java:76)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:602)     at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:414)     at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:772)     at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)     at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)     at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)     at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312)     at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)     at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)     at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:796)     at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:368)     at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:911)     at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:277)     at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)     at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
    at org.eclipse.jetty.server.Server.start(Server.java:423)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)     at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:97)
    at org.eclipse.jetty.server.Server.doStart(Server.java:387)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)     at org.gecko.rest.jersey.jetty.JettyServerRunnable.run(JettyServerRunnable.java:94)     at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    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:830)
Caused by:
java.lang.IllegalStateException: Not inside a request scope.
    at org.glassfish.jersey.internal.guava.Preconditions.checkState(Preconditions.java:169)     at org.glassfish.jersey.process.internal.RequestScope.current(RequestScope.java:153)     at org.glassfish.jersey.inject.hk2.RequestContext.findOrCreate(RequestContext.java:55)
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2102)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:758)     at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:721)     at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:691)     at org.glassfish.jersey.inject.hk2.AbstractHk2InjectionManager.getInstance(AbstractHk2InjectionManager.java:160)     at org.glassfish.jersey.inject.hk2.ImmediateHk2InjectionManager.getInstance(ImmediateHk2InjectionManager.java:30)     at org.glassfish.jersey.internal.inject.ProviderBinder.bindProvider(ProviderBinder.java:76)     at org.glassfish.jersey.server.ResourceModelConfigurator.bindProvidersAndResources(ResourceModelConfigurator.java:165)     at org.glassfish.jersey.server.ResourceModelConfigurator.init(ResourceModelConfigurator.java:63)     at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:342)     at org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$1(ApplicationHandler.java:293)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:232)     at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:292)     at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:259)     at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)     at org.glassfish.jersey.servlet.ServletContainer.reload(ServletContainer.java:659)     at org.gecko.rest.jersey.runtime.servlet.WhiteboardServletContainer.reload(WhiteboardServletContainer.java:99)     at org.gecko.rest.jersey.runtime.servlet.WhiteboardServletContainer.init(WhiteboardServletContainer.java:76)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:602)     at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:414)     at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:772)     at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)     at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)     at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)     at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312)     at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)     at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)     at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:796)     at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:368)     at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:911)     at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:277)     at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)     at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
    at org.eclipse.jetty.server.Server.start(Server.java:423)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)     at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:97)
    at org.eclipse.jetty.server.Server.doStart(Server.java:387)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)     at org.gecko.rest.jersey.jetty.JettyServerRunnable.run(JettyServerRunnable.java:94)     at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    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:830)

--

Jürgen Albert
CEO
Member Eclipse OSGi Working Group Steering Committee


Data In Motion Consulting GmbH

Kahlaische Str. 4
07745 Jena

Mobil:  +49 157-72521634
E-Mail: j.albert@xxxxxxxxxxxxxxx
Web: www.datainmotion.de

XING:   https://www.xing.com/profile/Juergen_Albert5
LinkedIn: https://www.linkedin.com/in/juergen-albert-6a1796/

Rechtliches

Jena HBR 513025



Back to the top