eclipse-ee4j / eclipse-ee4j/jersey
Can't inject generic type by HK2 to CDI
- Dominant language
- Java
- Stars
- 730
- Forks
- 382
- PR merge metrics
- No merged PRs in 30d
Description
Let's say I have
```
@Contract
public class MyContract
@Service
public class MyService implements MyContract
```
I'm trying to make this injectable by HK2 into CDI using Hk2CustomBoundTypesProvider.
The CDI bean has
```
@Inject
MyContract beanByHk2;
```
In the custom bound types provider, if I do something like
```
@Override
public Set getHk2Types() {
Set set = new HashSet<>();
set.add(MyContract.class);
return set;
}
```
I get
> org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type MyContract with qualifiers @Default
This is probably fine. But if I do something like
```
@Override
public Set getHk2Types() {
Set set = new HashSet<>();
set.add(new ParameterizedTypeImpl(MyContract.class, String.class));
return set;
}
```
I get
> java.lang.ClassCastException: org.jboss.weld.util.reflection.ParameterizedTypeImpl cannot be cast to java.lang.Class
> at org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider$Hk2Bean.getBeanClass(CdiComponentProvider.java:951)
> at org.jboss.weld.bootstrap.events.AfterBeanDiscoveryImpl.validateBean(AfterBeanDiscoveryImpl.java:98)
> at org.jboss.weld.bootstrap.events.AfterBeanDiscoveryImpl.addBean(AfterBeanDiscoveryImpl.java:81)
> at org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider.afterDiscoveryObserver(CdiComponentProvider.java:753)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:497)
> at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:88)
> at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:78)
> at org.jboss.weld.injection.MethodInvocationStrategy$SimpleMethodInvocationStrategy.invoke(MethodInvocationStrategy.java:129)
> at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:306)
> at org.jboss.weld.event.ExtensionObserverMethodImpl.sendEvent(ExtensionObserverMethodImpl.java:121)
> at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:284)
> at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:262)
> at org.jboss.weld.event.ObserverNotifier.notifySyncObservers(ObserverNotifier.java:271)
> at org.jboss.weld.event.ObserverNotifier.notify(ObserverNotifier.java:260)
> at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:154)
> at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:148)
> at org.jboss.weld.bootstrap.events.AbstractContainerEvent.fire(AbstractContainerEvent.java:54)
> at org.jboss.weld.bootstrap.events.AbstractDefinitionContainerEvent.fire(AbstractDefinitionContainerEvent.java:42)
> at org.jboss.weld.bootstrap.events.AfterBeanDiscoveryImpl.fire(AfterBeanDiscoveryImpl.java:61)
> at org.jboss.weld.bootstrap.WeldStartup.deployBeans(WeldStartup.java:420)
> at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:83)
> at com.oracle.injection.provider.weld.WeldInjectionContainer.deploy(WeldInjectionContainer.java:143)
> at com.oracle.injection.integration.CDIAppDeploymentExtension.initCdi(CDIAppDeploymentExtension.java:66)
> at com.oracle.injection.integration.CDIAppDeploymentExtension.activate(CDIAppDeploymentExtension.java:41)
> at weblogic.application.internal.flow.AppDeploymentExtensionFlow.activate(AppDeploymentExtensionFlow.java:39)
> at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:753)
> at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
> at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:263)
> at weblogic.application.internal.EarDeployment.activate(EarDeployment.java:67)
> at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:165)
> at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:80)
> at weblogic.deploy.internal.targetserver.operations.AbstractOperation.activate(AbstractOperation.java:601)
> at weblogic.deploy.internal.targetserver.operations.ActivateOperation.activateDeployment(ActivateOperation.java:171)
> at weblogic.deploy.internal.targetserver.operations.ActivateOperation.doCommit(ActivateOperation.java:121)
> at weblogic.deploy.internal.targetserver.operations.AbstractOperation.commit(AbstractOperation.java:343)
> at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentCommit(DeploymentManager.java:895)
> at weblogic.deploy.internal.targetserver.DeploymentManager.activateDeploymentList(DeploymentManager.java:1422)
> at weblogic.deploy.internal.targetserver.DeploymentManager.handleCommit(DeploymentManager.java:454)
> at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.commit(DeploymentServiceDispatcher.java:181)
> at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doCommitCallback(DeploymentReceiverCallbackDeliverer.java:195)
> at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$100(DeploymentReceiverCallbackDeliverer.java:13)
> at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$2.run(DeploymentReceiverCallbackDeliverer.java:68)
> at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:643)
> at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:348)
> at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:333)
> at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:54)
> at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41)
> at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:617)
> at weblogic.work.ExecuteThread.execute(ExecuteThread.java:397)
> at weblogic.work.ExecuteThread.run(ExecuteThread.java:346)
I think this is the bug here. The getHk2Types returns Set, but the returned members seem to be cast to Class, failing to accept any other Type implementations.
#### Environment
Running WLS 12.2.1.
#### Affected Versions
[2.21]
Contributor guide
Assessment
This issue has not been assessed yet.