[
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