Hi,
I'm trying to debug an ugly issue I really don't understand - not sure
if it is a bug or not.
I have an application which works fine, using this pattern:
ServiceLocator locator =
ServiceLocatorFactory.getInstance().create(serviceLocatorName);
ServiceLocatorUtilities.addClasses(locator, ac.getAnnotatedClasses())
The annotated class list is coming from this utility:
https://github.com/VA-CTT/HK2Utilities
Which essentially finds all HK2 annotated classes on the classpath
without relying on the inhabitant files.
Then:
locator.getService(RunLevelController.class).proceedTo(runLevel);
All of this works fine in a stand-alone app.
Now, I'm trying to deploy within GlassFish, while also using Jersey.
In this environment, the deployment fails with a mess of exceptions
along these lines:
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no
object available for injection at
SystemInjecteeImpl(requiredType=AsyncRunLevelContext,parent=RunLevelContext,qualifiers={},position=0,optional=false,self=false,unqualified=null,853404053)
at
org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:75)
at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:211)
at
org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:228)
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:357)
at
org.jvnet.hk2.internal.AutoActiveDescriptor.create(AutoActiveDescriptor.java:150)
at
org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:463)
at
org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:83)
at
org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:71)
at
org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:97)
at java.util.concurrent.FutureTask.run(Unknown Source)
at
org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture.run(Cache.java:154)
at org.glassfish.hk2.utilities.cache.Cache.compute(Cache.java:199)
at
org.jvnet.hk2.internal.SingletonContext.findOrCreate(SingletonContext.java:122)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2072)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
at
org.jvnet.hk2.internal.ServiceLocatorImpl._resolveContext(ServiceLocatorImpl.java:2088)
at
org.jvnet.hk2.internal.ServiceLocatorImpl.access$000(ServiceLocatorImpl.java:121)
at
org.jvnet.hk2.internal.ServiceLocatorImpl$3.compute(ServiceLocatorImpl.java:181)
at
org.jvnet.hk2.internal.ServiceLocatorImpl$3.compute(ServiceLocatorImpl.java:177)
at
org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:97)
at java.util.concurrent.FutureTask.run(Unknown Source)
at
org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture.run(Cache.java:154)
at org.glassfish.hk2.utilities.cache.Cache.compute(Cache.java:199)
at
org.jvnet.hk2.internal.ServiceLocatorImpl.resolveContext(ServiceLocatorImpl.java:2107)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2050)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1213)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1144)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$UpOneLevel.run(CurrentTaskFuture.java:762)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
MultiException stack 2 of 5
java.lang.IllegalArgumentException: While attempting to resolve the
dependencies of org.glassfish.hk2.runlevel.RunLevelContext errors were found
at
org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:246)
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:357)
at
org.jvnet.hk2.internal.AutoActiveDescriptor.create(AutoActiveDescriptor.java:150)
at
org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:463)
at
org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:83)
at
org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:71)
at
org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:97)
at java.util.concurrent.FutureTask.run(Unknown Source)
at
org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture.run(Cache.java:154)
at org.glassfish.hk2.utilities.cache.Cache.compute(Cache.java:199)
at
org.jvnet.hk2.internal.SingletonContext.findOrCreate(SingletonContext.java:122)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2072)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
at
org.jvnet.hk2.internal.ServiceLocatorImpl._resolveContext(ServiceLocatorImpl.java:2088)
at
org.jvnet.hk2.internal.ServiceLocatorImpl.access$000(ServiceLocatorImpl.java:121)
at
org.jvnet.hk2.internal.ServiceLocatorImpl$3.compute(ServiceLocatorImpl.java:181)
at
org.jvnet.hk2.internal.ServiceLocatorImpl$3.compute(ServiceLocatorImpl.java:177)
at
org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:97)
at java.util.concurrent.FutureTask.run(Unknown Source)
at
org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture.run(Cache.java:154)
at org.glassfish.hk2.utilities.cache.Cache.compute(Cache.java:199)
at
org.jvnet.hk2.internal.ServiceLocatorImpl.resolveContext(ServiceLocatorImpl.java:2107)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2050)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1213)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1144)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$UpOneLevel.run(CurrentTaskFuture.java:762)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
MultiException stack 3 of 5
java.lang.IllegalStateException: Unable to perform operation: resolve on
org.glassfish.hk2.runlevel.RunLevelContext
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:386)
at
org.jvnet.hk2.internal.AutoActiveDescriptor.create(AutoActiveDescriptor.java:150)
at
org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:463)
at
org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:83)
at
org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:71)
at
org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:97)
at java.util.concurrent.FutureTask.run(Unknown Source)
at
org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture.run(Cache.java:154)
at org.glassfish.hk2.utilities.cache.Cache.compute(Cache.java:199)
at
org.jvnet.hk2.internal.SingletonContext.findOrCreate(SingletonContext.java:122)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2072)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
at
org.jvnet.hk2.internal.ServiceLocatorImpl._resolveContext(ServiceLocatorImpl.java:2088)
at
org.jvnet.hk2.internal.ServiceLocatorImpl.access$000(ServiceLocatorImpl.java:121)
at
org.jvnet.hk2.internal.ServiceLocatorImpl$3.compute(ServiceLocatorImpl.java:181)
at
org.jvnet.hk2.internal.ServiceLocatorImpl$3.compute(ServiceLocatorImpl.java:177)
at
org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:97)
at java.util.concurrent.FutureTask.run(Unknown Source)
at
org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture.run(Cache.java:154)
at org.glassfish.hk2.utilities.cache.Cache.compute(Cache.java:199)
at
org.jvnet.hk2.internal.ServiceLocatorImpl.resolveContext(ServiceLocatorImpl.java:2107)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2050)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1213)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1144)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$UpOneLevel.run(CurrentTaskFuture.java:762)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
MultiException stack 4 of 5
java.lang.IllegalStateException: While attempting to create a service
for SystemDescriptor(
implementation=gov.vha.isaac.ochre.api.util.WorkExecutors
contracts={gov.vha.isaac.ochre.api.util.WorkExecutors}
scope=org.glassfish.hk2.runlevel.RunLevel
qualifiers={}
descriptorType=CLASS
descriptorVisibility=NORMAL
metadata=runLevelValue={-1},runLevelMode={1}
rank=0
loader=null
proxiable=null
proxyForSameScope=null
analysisName=default
id=62
locatorId=8
identityHashCode=1392457865
reified=true) in scope org.glassfish.hk2.runlevel.RunLevel an error
occured while locating the context
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2055)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1213)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1144)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
MultiException stack 5 of 5
java.lang.IllegalStateException: While attempting to create a service
for SystemDescriptor(
implementation=gov.vha.isaac.ochre.api.util.WorkExecutors
contracts={gov.vha.isaac.ochre.api.util.WorkExecutors}
scope=org.glassfish.hk2.runlevel.RunLevel
qualifiers={}
descriptorType=CLASS
descriptorVisibility=NORMAL
metadata=runLevelValue={-1},runLevelMode={1}
rank=0
loader=null
proxiable=null
proxyForSameScope=null
analysisName=default
id=11
locatorId=8
identityHashCode=1088961042
reified=true) in scope org.glassfish.hk2.runlevel.RunLevel an error
occured while locating the context
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2055)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
at
org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1213)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1144)
at
org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$UpOneLevel.run(CurrentTaskFuture.java:762)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
I know that the AsyncRunLevelContext is in the system - I'm printing
this out when I add it to my locator:
[2016-02-03T18:35:21.786-0500] [glassfish 4.1] [INFO] [] [] [tid:
_ThreadID=97 _ThreadName=Thread-8] [timeMillis: 1454542521786]
[levelValue: 800] [[
2016-02-03 18:35:21,786 DEBUG [admin-listener(7)]
HK2Utilities.HK2RuntimeInitializer (HK2RuntimeInitializer.java:113) -
Added SystemDescriptor(
implementation=org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext
contracts={org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext}
scope=javax.inject.Singleton
qualifiers={}
descriptorType=CLASS
descriptorVisibility=LOCAL
metadata=
rank=0
loader=null
proxiable=null
proxyForSameScope=null
analysisName=default
id=39
locatorId=8
identityHashCode=2097701558
reified=true)]]
So I can't understand why this isn't being found.
I know that there is an issue with multiple ServiceLocator, because
Jersey has already started one. I have also tried various permutations
of setting the ServiceLocator from Jersey as my parent service locator,
or calling the bridging methods to try to bridge my service locator to
the jersey service locator (and the reverse) but that only seems to
result in deeper error traces.
I suppose another thing I haven't investigated is the interaction
between glassfish providing HK2 libraries, and my war file also
including libraries.
Any ideas?
Thanks,
Dan