Details
-
Bug
-
Status: Closed
-
Minor
-
Resolution: Fixed
-
1.0.0-alpha-1
-
None
-
standard OWB configuration
Description
WebBean is defined as:
@Named
public class MethodTypeProduces1<T extends Bc> {
@Produces @Dependent @Named("ProMethodParameterized3") ArrayList<T> methodPT3() {
and injected as:
@Named
@Dependent
public class ProMethodTestGroup3A {
public @Inject @Dependent @Named("ProMethodParameterized3") ArrayList<Dc> pt3;
with BC extending DC as follows:
public class Bc extends Dc implements Fi {
gives this error:
Jul 28, 2010 9:26:51 AM org.apache.webbeans.config.BeansDeployer deploy
SEVERE:
Throwable occurred: javax.enterprise.inject.UnsatisfiedResolutionException: Api type [java.util.ArrayList] is not found with the qualifiers [@javax.inject.Named(value=ProMethodParameterized3)] for injection into Field Injection Point, field name : pt3, Bean Owner : [Name:proMethodTestGroup3A,WebBeans Type:MANAGED,API Types:[com.ibm.jcdi.test.ProMethodTestGroup3A,java.lang.Object],Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default,javax.inject.Named]]
at org.apache.webbeans.container.ResolutionUtil.checkResolvedBeans(ResolutionUtil.java:121)
at org.apache.webbeans.container.InjectionResolver.checkInjectionPoints(InjectionResolver.java:185)
at org.apache.webbeans.container.BeanManagerImpl.validate(BeanManagerImpl.java:1025)
injection should be checked/resolved here in org.apache.webbeans.util.ClassUtil, but this method returns false
public static boolean checkRequiredTypeIsClassAndBeanTypeIsVariable(Type beanTypeArg, Type requiredTypeArg)
{
Class<?> clazzRequiredType = (Class<?>)requiredTypeArg;
TypeVariable<?> tvBeanTypeArg = (TypeVariable<?>)beanTypeArg;
Type tvBound = tvBeanTypeArg.getBounds()[0];
if(tvBound instanceof Class)
{
Class<?> clazzTvBound = (Class<?>)tvBound;
if(clazzTvBound != Object.class)
{
if(!clazzTvBound.isAssignableFrom(clazzRequiredType))
}
}
return true;
}
But since clazzTvBound is Bc and classRequiredType is Dc
Bc.isAssignableFrom(Dc) returns false, so the ! is true, and the function returns false.
fix seems to simply go back to the old code in this routine, this code was changeed on 4/28, and
I can't see why is was changed.
But the check needs to verify that the required class can be assigned from the given bean class, as follows:
if(tvBound instanceof Class)
{
Class<?> clazzTvBound = (Class<?>)tvBound;
if(clazzRequiredType.isAssignableFrom(clazzTvBound))
}
return false;
There is also a similar incorrect injection exception using the above example, but with an injection of:
public class TG4 <T extends Dc> {
public @Inject @Dependent @Named("ProMethodParameterized3") ArrayList<T> ptT;
I think the line of code in error here is in the method:
(same class as in the previous problem: org.apache.webbeans.util.ClassUtil)
public static boolean checkBeanTypeAndRequiredIsTypeVariable(Type beanTypeArg, Type requiredTypeArg)
where:
if(clazzTvBeanBound.isAssignableFrom(clazzTvRequiredBound))
should be replaced with:
(clazzTvRequiredBound.isAssignableFrom(clazzTvBeanBound))