There’s a RESTv2 bug on Confluence 9.0.0-m48:
Apparently some OSGi-imported components are not available for injection into REST endpoints, but they are available for injection into @Component spring beans.
My REST endpoint is defined like this:
@Path("/admin")
public class ImageMapAdminResource {
@Inject private PermissionManager permissionManager;
@Inject private ContentEntityManager contentEntityManager;
...
A spring bean is defined like this:
@Component
public class ImageDownloader {
@Autowired AttachmentManager attachmentManager;
@Autowired ContentEntityManager contentEntityManager;
...
When sending a request to the endpoint I get the ‘system error’ page in the browser and the following exception is logged:
Caused by: A MultiException has 3 exceptions. They are:
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=ContentEntityManager,parent=ImageMapAdminResource,qualifiers={},position=-1,optional=false,self=false,unqualified=null,1992828686)
2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.k15t.scroll.imagemap.rest.ImageMapAdminResource errors were found
3. java.lang.IllegalStateException: Unable to perform operation: resolve on com.k15t.scroll.imagemap.rest.ImageMapAdminResource
at org.jvnet.hk2.internal.Collector.throwIfErrors(Collector.java:65)
at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:226)
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:334)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:463)
at org.glassfish.jersey.inject.hk2.RequestContext.findOrCreate(RequestContext.java:59)
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:161)
at org.glassfish.jersey.inject.hk2.ImmediateHk2InjectionManager.getInstance(ImmediateHk2InjectionManager.java:30)
at org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:122)
at org.glassfish.jersey.server.model.MethodHandler$ClassBasedMethodHandler.getInstance(MethodHandler.java:260)
at org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter.apply(PushMethodHandlerRouter.java:51)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:86)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:89)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:89)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:89)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:89)
at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:69)
at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:38)
at org.glassfish.jersey.process.internal.Stages.process(Stages.java:173)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:248)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
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.process(Errors.java:244)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:235)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:684)
at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394)
... 379 more
Caused by: org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=ContentEntityManager,parent=ImageMapAdminResource,qualifiers={},position=-1,optional=false,self=false,unqualified=null,1992828686)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:51)
at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:188)
at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:211)
... 409 more
When attaching a debugger to some other endpoint using the spring bean I can see that it got the ContentEntityManager
injected, so it only seems to affect jersey dependency injection.
So far I could only identify this specific ContentEntityManager
being affected, which seems to be declared in the same way as PageManager
in confluence.jar’s contentServiceContext.xml
. Yet PageManager
is properly injected into REST endpoints.
<bean id="contentEntityManager" class="com.atlassian.confluence.impl.content.DefaultContentEntityManager"
plugin:available="true">
<plugin:interface>com.atlassian.confluence.core.ContentEntityManager</plugin:interface>
...
</bean>
<bean id="pageManager" class="com.atlassian.confluence.impl.content.DefaultPageManager" plugin:available="true">
<plugin:interface>com.atlassian.confluence.pages.PageManager</plugin:interface>
...
</bean>