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 08:28:38 UTC
[jira] [Resolved] (FELIX-4832) ClassCastException with autoconfig
Iterable fields
[ https://issues.apache.org/jira/browse/FELIX-4832?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Pierre De Rop resolved FELIX-4832.
----------------------------------
Resolution: Fixed
Bug fixed and committed in rv 1667672.
> 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)