[ 
https://issues.apache.org/jira/browse/OWB-893?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13755531#comment-13755531
 ] 

Mark Struberg commented on OWB-893:
-----------------------------------

I'm currently working on a few tests in this area.

The CDI-1.0 spec is defined for 

* generic bean type is assigned to generic injection point type
* generic bean type is assigned to raw or unbound (erased) injection point type

but it does say nothing abou the other way around: what does happen if the 
injection point type is generic but the bean type is raw or unbound. In 
OWB-1.1.x we just allowed this scenario and did the cast as the JVM would do it 
native: just assign the value user and if the generic type does mismatch a 
ClassCastException would be thrown at runtime anyway. But in this case the 
producer method has at least the possibility to evaluate the InjectionPoint and 
perform the right thing. 

Now the bad part: in CDI-1.1 some folks (who didn't like to listen to me when I 
explained it to them) introduced that additional part:
"A raw bean type is considered assignable to a parameterized required type if 
the raw types are identical and all type parameters of the required type are 
either unbounded type variables or java.lang.Object."


With other words:

@Inject Stable<?> stable; would work if there is a @Produces Stable<Horse> 
method.
But there is no way with the current wording to do it the other way around:
@Inject Stable<Horse> horseStable;
@Inject Stable<Pig> pigStable;
 with a single producer method @Produces <PET> Stable<PET>

got me?

If it would be only me, then I'd really ditch this paragraph again and do it 
properly, which means we need to introduce a multi-pass approach as this imo 
prevents us from providing such a 'generic' producer method which takes the 
type info from the InjectionPoint. 
This could be done by introducing a measuring approach as it's implemented in 
the JVM at compile time (resp the bridge method stuff at runtime): if there is 
a @Produces Stable<Pig> then this would take precedence over the unbound 
@Produces <PET> Stable<PET>.
                
> OpenWebBeans 1.2.1 fails when injecting generic value holder
> ------------------------------------------------------------
>
>                 Key: OWB-893
>                 URL: https://issues.apache.org/jira/browse/OWB-893
>             Project: OpenWebBeans
>          Issue Type: Bug
>          Components: Injection and Lookup
>    Affects Versions: 1.2.1
>            Reporter: Arjan Tijms
>            Assignee: Mark Struberg
>
> In OmniFaces we're using a producer method with the following signature:
> {code}
> @Produces
> @Param
> public <V> ParamValue<V> produce(InjectionPoint injectionPoint)
> {code}
> Injection then takes place into a bean as follows:
> {code}
> @Inject @Param
> private ParamValue<String> text1;
> {code}
> {{@Param}} is a qualifier with only non-binding attributes.
> See 
> [RequestParameterProducer|https://code.google.com/p/omnifaces/source/browse/src/org/omnifaces/cdi/param/RequestParameterProducer.java]
>  and 
> [Param|https://code.google.com/p/omnifaces/source/browse/src/org/omnifaces/cdi/Param.java]
> This works in all versions of Weld that we tested on and in OpenWebBeans 
> 1.1.8 (TomEE 1.5.2.). Unfortunately it does not work with OpenWebBeans 
> 1.2.1-SNAPSHOT (TomEE 1.6.0-SNAPSHOT).
> The problem seems to be that 1.2.1 has added an additional check in 
> {{org.apache.webbeans.util.GenericsUtil.satisfiesDependency}} that wasn't 
> there before:
> {code}
> return ClassUtil.isSame(injectionPointRawType, beanRawType)? 
> isAssignableFrom(injectionPointType, beanType): false;
> {code}
> The problem is with {{isAssignableFrom}}, because the producer is always seen 
> as producing a {{ParamValue<Object}}. The actual values at the point of 
> evaluation with the above given injection example where:
> {noformat}
> injectionPoint = ParamValue<class java.lang.String> 
> beanType = ParamValue<class java.lang.Object>
> {noformat}
> Those are not directly assignable so the injection fails.
> Is OmniFaces doing something wrong here, is this check to strict, or should 
> the producer type not be seen as {{ParamValue<Object>}}?

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to