You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Pierre De Rop (JIRA)" <ji...@apache.org> on 2015/03/19 07:37:38 UTC

[jira] [Created] (FELIX-4832) ClassCastException with autoconfig Iterable fields

Pierre De Rop created FELIX-4832:
------------------------------------

             Summary: ClassCastException with autoconfig Iterable fields
                 Key: FELIX-4832
                 URL: https://issues.apache.org/jira/browse/FELIX-4832
             Project: Felix
          Issue Type: Bug
          Components: Dependency Manager
    Affects Versions: org.apache.felix.dependencymanager-r1
            Reporter: Pierre De Rop
            Assignee: Pierre De Rop
            Priority: Critical
             Fix For: org.apache.felix.dependencymanager-r2


When you configure a service dependency using auto configuration without specifying a field name and when there is a field in the component instance with a type that is assignable to an Iterable, but without a valid generic type, then a fatal class cast exception occurs.

For example, assuming we have the following Activator code:

{code}
dm.createComponent()
.setImplementation(Consumer.class)
.add(dm.createServiceDependency().setService(OtherService.class).setRequired(true));
{code}

and the following consumer, which has a valid "m_providers" field, but another "m_notInjectMe" field that must not be injected:

{code}
class Consumer {
        // Auto injected
        final Iterable<OtherService> m_providers = new ConcurrentLinkedQueue<>();
      
       // should never be injected, but causes a class cast exception:
        final List m_notInjectMe = new ArrayList();
...
}
{code}

Then the following exception occurs:
{code}
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
        at org.apache.felix.dm.impl.FieldUtil.mayInjectToIterable(FieldUtil.java:292)
        at org.apache.felix.dm.impl.FieldUtil.mapField(FieldUtil.java:255)
        at org.apache.felix.dm.impl.FieldUtil.injectDependencyField(FieldUtil.java:105)
        at org.apache.felix.dm.impl.ComponentImpl.configureImplementation(ComponentImpl.java:1027)
        at org.apache.felix.dm.impl.ComponentImpl.invokeAutoConfigDependencies(ComponentImpl.java:822)
        at org.apache.felix.dm.impl.ComponentImpl.performTransition(ComponentImpl.java:543)
        at org.apache.felix.dm.impl.ComponentImpl.handleChange(ComponentImpl.java:494)
        at org.apache.felix.dm.impl.ComponentImpl.handleAdded(ComponentImpl.java:360)
        at org.apache.felix.dm.impl.ComponentImpl.access$700(ComponentImpl.java:68)
        at org.apache.felix.dm.impl.ComponentImpl$5.run(ComponentImpl.java:289)
        at org.apache.felix.dm.impl.SerialExecutor.runTask(SerialExecutor.java:138)
        at org.apache.felix.dm.impl.SerialExecutor.runTasks(SerialExecutor.java:120)
        at org.apache.felix.dm.impl.SerialExecutor.execute(SerialExecutor.java:86)
        at org.apache.felix.dm.impl.SerialExecutor.execute(SerialExecutor.java:105)
        at org.apache.felix.dm.impl.ComponentImpl.handleEvent(ComponentImpl.java:284)
        at org.apache.felix.dm.impl.ServiceDependencyImpl.addedService(ServiceDependencyImpl.java:256)
        at org.apache.felix.dm.tracker.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1278)
        at org.apache.felix.dm.tracker.ServiceTracker$Tracked$2.execute(ServiceTracker.java:1394)
        at org.apache.felix.dm.tracker.ServiceTracker$Tracked$1.run(ServiceTracker.java:1191)
        at org.apache.felix.dm.impl.SerialExecutor.runTask(SerialExecutor.java:138)
        at org.apache.felix.dm.impl.SerialExecutor.runTasks(SerialExecutor.java:120)
        at org.apache.felix.dm.impl.SerialExecutor.execute(SerialExecutor.java:86)
        at org.apache.felix.dm.tracker.ServiceTracker$Tracked.serviceChangedHideAspects(ServiceTracker.java:1197)
        at org.apache.felix.dm.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1052)
        at org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:987)
        at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:838)
        at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:545)
        at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4547)
        at org.apache.felix.framework.Felix.registerService(Felix.java:3521)
        at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:348)
        at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:322)
        at com.alcatel.as.service.metering2.SimpleMonitorable$1.run(SimpleMonitorable.java:164)
        at com.alcatel.as.service.concurrent.SerialExecutor.runTasks(SerialExecutor.java:64)
        at com.alcatel.as.service.concurrent.SerialExecutor.execute(SerialExecutor.java:49)
        at com.alcatel.as.service.metering2.SimpleMonitorable.start(SimpleMonitorable.java:159)
        at com.alcatel.as.service.metering2.impl.MonitorableSystem.start(MonitorableSystem.java:166)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.felix.dm.impl.InvocationUtil.invokeMethod(InvocationUtil.java:112)
        at org.apache.felix.dm.impl.InvocationUtil.invokeCallbackMethod(InvocationUtil.java:67)
        at org.apache.felix.dm.impl.ComponentImpl.invokeCallbackMethod(ComponentImpl.java:923)
        at org.apache.felix.dm.impl.ComponentImpl.invoke(ComponentImpl.java:893)
        at org.apache.felix.dm.impl.ComponentImpl.performTransition(ComponentImpl.java:555)
        at org.apache.felix.dm.impl.ComponentImpl.handleChange(ComponentImpl.java:494)
        at org.apache.felix.dm.impl.ComponentImpl.startDependencies(ComponentImpl.java:662)
        at org.apache.felix.dm.impl.ComponentImpl.performTransition(ComponentImpl.java:537)
        at org.apache.felix.dm.impl.ComponentImpl.handleChange(ComponentImpl.java:494)
        at org.apache.felix.dm.impl.ComponentImpl.access$500(ComponentImpl.java:68)
        at org.apache.felix.dm.impl.ComponentImpl$3.run(ComponentImpl.java:227)
        at org.apache.felix.dm.impl.SerialExecutor.runTask(SerialExecutor.java:138)
        at org.apache.felix.dm.impl.SerialExecutor.runTasks(SerialExecutor.java:120)
        at org.apache.felix.dm.impl.SerialExecutor.execute(SerialExecutor.java:86)
        at org.apache.felix.dm.impl.SerialExecutor.execute(SerialExecutor.java:105)
        at org.apache.felix.dm.impl.ComponentImpl.start(ComponentImpl.java:223)
        at org.apache.felix.dm.impl.ComponentScheduler.add(ComponentScheduler.java:71)
        at org.apache.felix.dm.DependencyManager.add(DependencyManager.java:173)
        at com.alcatel.as.service.metering2.impl.Activator.init(Activator.java:56)
        at org.apache.felix.dm.DependencyActivatorBase.start(DependencyActivatorBase.java:75)
        at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:697)
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:2223)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2141)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:977)
        at com.alcatel.as.service.bundleinstaller.impl.BundleInstallerImpl$DeployedBundle.start(BundleInstallerImpl.java:961)
        at com.alcatel.as.service.bundleinstaller.impl.BundleInstallerImpl.startBundles(BundleInstallerImpl.java:633)
        at com.alcatel.as.service.bundleinstaller.impl.BundleInstallerImpl.frameworkEvent(BundleInstallerImpl.java:152)
        at com.alcatel.as.service.bundleinstaller.impl.BundleInstallerImpl.start(BundleInstallerImpl.java:121)
        at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:697)
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:2223)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2141)
        at org.apache.felix.framework.Felix.updateBundle(Felix.java:2481)
        at org.apache.felix.framework.BundleImpl.update(BundleImpl.java:995)
        at org.apache.felix.framework.BundleImpl.update(BundleImpl.java:982)
        at com.alcatel.as.service.bundleinstaller.impl.BundleInstallerImpl.checkSelfUpdate(BundleInstallerImpl.java:202)
        at com.alcatel.as.service.bundleinstaller.impl.BundleInstallerImpl.frameworkEvent(BundleInstallerImpl.java:139)
        at org.apache.felix.framework.util.EventDispatcher.invokeFrameworkListenerCallback(EventDispatcher.java:880)
        at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:830)
        at org.apache.felix.framework.util.EventDispatcher.run(EventDispatcher.java:1143)
        at org.apache.felix.framework.util.EventDispatcher.access$000(EventDispatcher.java:55)
        at org.apache.felix.framework.util.EventDispatcher$1.run(EventDispatcher.java:102)
        at java.lang.Thread.run(Thread.java:745)
{code}

This exception prevents the correct component activation.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)