eclipse-ee4j / eclipse-ee4j/jersey

org.glassfish.hk2.api.MultiException when registering the servlet

Open
#4,527 3 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
730
Forks
382
PR merge metrics
No merged PRs in 30d

Description

I am using jersey in osgi and I get this error when my servlet is being registered.

Implementation code
--------------------------------

```
package com.foo.bar.john.doe.core.rest.webconfig;

import java.io.IOException;
import java.util.Dictionary;
import java.util.Hashtable;

import javax.naming.ConfigurationException;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* This OSGI Component starts up and registers the rmpoc web services.
*/
@Component (name = "com.foo.bar.john.doe.core.rest.webconfig.ConfigWebComp", immediate = true)
public class ConfigWebComponent
{
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigWebComponent.class);
private static final String CONTEXT_PATH = "/hello";
private static final String JERSEY_SERVER_PID = "org.glassfish.jersey.core.jersey-server";
private static final String JAXRS_CONNECTOR_PID = "com.eclipsesource.jaxrs.connector";

private static final String JERSEY_CONFIG_SERVER_WADL_DISABLE_WADL = "jersey.config.server.wadl.disableWadl";

public static final String JAX_RS_ROOT_PATH_PROPERTY = "root";
private static final String DISABLE_WADL_PROPERTY = "true";

@Reference (bind = "bindConfigurationAdmin", unbind = "unbindConfigurationAdmin", cardinality = ReferenceCardinality.MANDATORY_UNARY, policy = ReferencePolicy.DYNAMIC)
private ConfigurationAdmin myConfigurationAdmin;

@Activate
public void start() throws IOException
{
LOGGER.info("Activating the ConfigWebComp.");
updateConfiguration();
}

@Deactivate
public void stop()
{
LOGGER.info("Service ConfigWebComp stopped.");
}

/**
* Setups up the configuration for the rest server.
*
* @param componentContext the context
* @throws IOException if access to persistent storage fails
* @throws NullPointerException in case the {@link ConfigurationAdmin} is not available
*/
private void updateConfiguration() throws IOException
{
LOGGER.info("Entering in method updateConfiguration,Configuration web services will be published on context path: {}", CONTEXT_PATH);
configureJerseyConfiguration();
configureJaxRsPublisher();
}

private void configureJerseyConfiguration()
{

Configuration componentConfiguration;
try
{
componentConfiguration = getServiceConfiguration(JERSEY_SERVER_PID);
Dictionary properties = componentConfiguration.getProperties();
if (properties == null)
{
properties = new Hashtable();
}
properties.put(JERSEY_CONFIG_SERVER_WADL_DISABLE_WADL, DISABLE_WADL_PROPERTY);
componentConfiguration.update(properties);
LOGGER.debug("Inside configureJerseyConfiguration,Configured the Jeresy wadl: {}", DISABLE_WADL_PROPERTY);
}
catch (IOException | ConfigurationException e)
{
LOGGER.error("Inside configureJerseyConfiguration,There was a problem in upgrading the JAX RS connector configuration,Exception occured is: {}", e.getMessage());
}
}

/**
* @param componentContext
*/
private void configureJaxRsPublisher()
{

LOGGER.debug("Entering in method configureJaxRsPublisher,Configuring the JAX RS connector.");
Configuration componentConfiguration;
try
{
componentConfiguration = getServiceConfiguration(JAXRS_CONNECTOR_PID);
componentConfiguration.getBundleLocation();
Dictionary properties = componentConfiguration.getProperties();
if (properties == null)
{
properties = new Hashtable();
}

properties.put(JAX_RS_ROOT_PATH_PROPERTY, CONTEXT_PATH);
componentConfiguration.update(properties);

LOGGER.debug("Inside configureJaxRsPublisher, Configured the JAX RS connector with contextPath: {}", CONTEXT_PATH);
}
catch (IOException | ConfigurationException e)
{
LOGGER.error("Inside configureJaxRsPublisher,There was a problem in upgrading the JAX RS connector configuration, Exception occured is: {}", e.getMessage());
}

}

/**
* Return the {@link Configuration} associated to an OSGi PID via the OSGi
* ConfigurationAdmin.
*
* @param servicePID
* PID of the service
* @param componentContext
* @throws IOException
* @throws ConfigurationException
*/
private Configuration getServiceConfiguration(final String servicePID) throws IOException, ConfigurationException
{

final Configuration configuration = myConfigurationAdmin.getConfiguration(servicePID, null);
if (configuration == null)
{
LOGGER.trace("Inside getServiceConfiguration,configuration cannot be NULL");
throw new ConfigurationException("Couldn't find configuration for " + servicePID);
}
return configuration;
}

/**
* Binds the {@link ConfigurationAdmin}.
*
* @param configurationAdmin
*/
public void bindConfigurationAdmin(ConfigurationAdmin configurationAdmin)
{
LOGGER.info("Binding ConfigurationAdmin in ConfigWebComponent: {}", configurationAdmin);
myConfigurationAdmin = configurationAdmin;
}

/**
* Unbinds the {@link ConfigurationAdmin}.
*
* @param configurationAdmin
*/
public void unbindConfigurationAdmin(ConfigurationAdmin configurationAdmin)
{
LOGGER.info("Unbinding ConfigurationAdmin in ConfigWebComponent: {}", configurationAdmin);
myConfigurationAdmin = null;
}

}

```
Versions
------------

> karaf@root()> list -t -0|grep -i hk
> 18 | Active | 20 | 2.31.0 | jersey-inject-hk2
> 92 | Active | 40 | 2.6.1 | HK2 API module
> 94 | Active | 40 | 2.6.1 | HK2 Implementation Utilities
> karaf@root()> list -t -0|grep -i jersey
> 17 | Active | 20 | 2.31.0 | jersey-core-common
> 18 | Active | 20 | 2.31.0 | jersey-inject-hk2
> 125 | Active | 80 | 2.17 | jersey-all
> 316 | Active | 80 | 2.31.0 | jersey-container-servlet-core
> 317 | Active | 80 | 2.31.0 | jersey-core-client
> 318 | Active | 80 | 2.31.0 | jersey-core-server
> 319 | Active | 80 | 2.31.0 | jersey-ext-entity-filtering
> 320 | Active | 80 | 2.31.0 | jersey-media-json-jackson
> 321 | Active | 80 | 2.31.0 | jersey-media-multipart
>

Logs
---------

> org.glassfish.hk2.api.MultiException: A MultiException has 1 exceptions. They are:
> 1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=ServiceLocator,parent=JaxbAutoDiscoverable,qualifiers={},position=-1,optional=false,self=false,unqualified=null,1708936903)
>
> at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:51)
> at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:988)
> at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:998)
> at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:1073)
> at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:1064)
> at org.glassfish.jersey.inject.hk2.AbstractHk2InjectionManager.createAndInitialize(AbstractHk2InjectionManager.java:189)
> at org.glassfish.jersey.inject.hk2.ImmediateHk2InjectionManager.createAndInitialize(ImmediateHk2InjectionManager.java:30)
> at org.glassfish.jersey.model.internal.CommonConfig.configureAutoDiscoverableProviders(CommonConfig.java:592)
> at org.glassfish.jersey.server.ResourceConfig.configureForcedAutoDiscoverableProviders(ResourceConfig.java:819)
> at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:324)
> 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.(ApplicationHandler.java:259)
> at org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:311)
> at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:154)
> at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:347)
> at javax.servlet.GenericServlet.init(GenericServlet.java:244)
> at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:656)
> at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:421)
> at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:746)
> 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.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
> at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)
> at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:739)
> at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:361)
> at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.startContext(HttpServiceContext.java:391)
> at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:821)
> at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:276)
> at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doStart(HttpServiceContext.java:267)
> at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
> at org.ops4j.pax.web.service.jetty.internal.JettyServerImpl$1.start(JettyServerImpl.java:329)
> at org.ops4j.pax.web.service.internal.HttpServiceStarted.registerServlet(HttpServiceStarted.java:252)
> at org.ops4j.pax.web.service.internal.HttpServiceStarted.registerServlet(HttpServiceStarted.java:223)
> at org.ops4j.pax.web.service.internal.HttpServiceStarted.registerServlet(HttpServiceStarted.java:207)
> at org.ops4j.pax.web.service.internal.HttpServiceProxy.registerServlet(HttpServiceProxy.java:69)
> at com.eclipsesource.jaxrs.publisher.internal.JerseyContext.registerServlet(JerseyContext.java:107)
> at com.eclipsesource.jaxrs.publisher.internal.JerseyContext.registerApplication(JerseyContext.java:85)
> at com.eclipsesource.jaxrs.publisher.internal.JerseyContext.registerServletWhenNotAlreadyRegistered(JerseyContext.java:77)
> at com.eclipsesource.jaxrs.publisher.internal.JerseyContext.addResource(JerseyContext.java:70)
> at com.eclipsesource.jaxrs.publisher.internal.JAXRSConnector.registerResource(JAXRSConnector.java:176)
> at com.eclipsesource.jaxrs.publisher.internal.JAXRSConnector.registerResource(JAXRSConnector.java:158)
> at com.eclipsesource.jaxrs.publisher.internal.JAXRSConnector.doAddResource(JAXRSConnector.java:152)
> at com.eclipsesource.jaxrs.publisher.internal.JAXRSConnector.addResource(JAXRSConnector.java:146)
> at com.eclipsesource.jaxrs.publisher.internal.ResourceTracker.delegateAddService(ResourceTracker.java:45)
> at com.eclipsesource.jaxrs.publisher.internal.ResourceTracker.addingService(ResourceTracker.java:39)
> at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941)
> at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:870)
> 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:901)
> at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:109)
> at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:920)
> at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
> at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:862)
> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:801)
> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:127)
> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:225)
> at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:469)
> at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:906)
> at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:892)
> at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:128)
> at org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:959)
> at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:732)
> at org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:666)
> at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:432)
> at org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:665)
> at org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:338)
> at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:382)
> at org.apache.felix.scr.impl.Activator.access$200(Activator.java:49)
> at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:264)
> at org.apache.felix.scr.impl.AbstractExtender.createExtension(AbstractExtender.java:196)
> at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:169)
> at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:49)
> at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:482)
> at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:415)
> at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232)
> at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:444)
> at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:908)
> at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
> at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
> at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:213)
> at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:120)
> at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:112)
> at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:168)
> at org.eclipse.osgi.container.Module.publishEvent(Module.java:476)
> at org.eclipse.osgi.container.Module.start(Module.java:467)
> at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:468)
> at org.eclipse.osgi.container.ModuleContainer.start(ModuleContainer.java:750)
> at org.eclipse.osgi.container.ModuleContainer.applyDelta(ModuleContainer.java:741)
> at org.eclipse.osgi.container.ModuleContainer.resolveAndApply(ModuleContainer.java:511)
> at org.eclipse.osgi.container.ModuleContainer.resolve(ModuleContainer.java:457)
> at org.eclipse.osgi.container.ModuleContainer.refresh(ModuleContainer.java:1001)
> at org.eclipse.osgi.container.ModuleContainer$ContainerWiring.dispatchEvent(ModuleContainer.java:1382)
> at org.eclipse.osgi.container.ModuleContainer$ContainerWiring.dispatchEvent(ModuleContainer.java:1)
> at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
> at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)
> Caused by: org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=ServiceLocator,parent=JaxbAutoDiscoverable,qualifiers={},position=-1,optional=false,self=false,unqualified=null,1708936903)
>

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.