[
https://issues.apache.org/jira/browse/OWB-431?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12893695#action_12893695
]
Bill Wigger commented on OWB-431:
---------------------------------
Spec:
"A parameterized bean type is considered assignable to a parameterized required
type if they have
identical raw type and for each parameter:
...
the required type parameter is an actual type, the bean type parameter is a
type variable and the
actual type is assignable to the upper bound, if any, of the type variable, "
notice in the spec how they use "assignable to" two different ways here. Maybe
it should have use
the phrase "assignable from" in the second part. But it seems the meaning
would have to be
that the required type has to be identical or a superclass of the bean type.
This is because if the
required type were a subclass of the bean type, then the injected bean type
would not have methods
in it that may be accessed by the required type.
In java the routine: x.isAssignableFrom(y)
is defined to return "true" if x is indentical to y, or x is a superclass of y.
therefore to conform to the spec, the proper test would be:
if (requiredType.isAssignableFrom(beanType)) return true.
At any rate, right now the code listed at the top of this report gives an
error, and it should not, since
the required type is a superclass of the bean type.
> Generic Type Inheritance not resolved correctly
> -----------------------------------------------
>
> Key: OWB-431
> URL: https://issues.apache.org/jira/browse/OWB-431
> Project: OpenWebBeans
> Issue Type: Bug
> Components: Injection and Lookup
> Affects Versions: 1.0.0-alpha-1
> Environment: standard OWB configuration
> Reporter: Bill Wigger
> Assignee: Gurkan Erdogdu
> Priority: Minor
> Fix For: 1.0.0-alpha-2
>
> Attachments: ClassUtilPatch.txt, ClassUtilPatch2.txt
>
> Original Estimate: 2h
> Remaining Estimate: 2h
>
> 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
> [[email protected](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 false;
> }
> }
> }
> 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 true;
> }
> }
> 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))
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.