[
https://issues.apache.org/jira/browse/FELIX-4832?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Pierre De Rop closed FELIX-4832.
> 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 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(SerialExecut