On 12/27/2012 3:35 AM, Mark Struberg wrote:

Hi Mark,

Hi Mike!

Thanks for your great tests, always good to get such feedback!

I guess you get a Instance<Foo> as Provider, right?

Yes, that is what I am seeing.

In that case 5.2.1 defines that we need to take the Alternative into account 
and filter it away.

Any thoughts on a work around until this can be fixed? I need to use the Provider interface to decouple my implementation. I have a Mock version of "Foo" in my unit tests, qualified as an Alternative (and noted in the beans.xml file).

Thanks
Mike

LieGrue,
strub




----- Original Message -----
From: Mike Olson <[email protected]>
To: [email protected]
Cc:
Sent: Thursday, December 27, 2012 5:18 AM
Subject: OWN 1.7 ignores Alternative when using the provider interface


Hello,

   I have a very simple setup where I have classes Foo1 and Foo2 that implement
the Foo interface

public interface Foo {
}
@Default
public class Foo1 implements Foo {

}
@Alternative
public class Foo2 implements Foo {

}

Then a class that gets 2 Foos injected

public class Main {

     @Inject
     Foo fooA;

     @Inject
     Provider<Foo> fooB;

     @PostConstruct
     public void init() {
         System.err.println("FooA:" + fooA);
         System.err.println("FooB:" + fooB.get());
     }
}

If my beans.xml file is empty, then I get 2 instances of Foo1 injected into the
class, as expected.

However, if I add

     <alternatives>
         <class>Foo2</class>
     </alternatives>

to my beans.xml, then I get an error when I run the application.

"""
INFO: All injection points were validated successfully.
Dec 26, 2012 9:11:29 PM org.apache.webbeans.lifecycle.AbstractLifeCycle
startApplication
INFO: OpenWebBeans Container has started, it took [359] ms.
FooA:Foo2@152c4d9
Dec 26, 2012 9:11:29 PM
org.apache.webbeans.component.AbstractInjectionTargetBean postConstructDefault
SEVERE: An error occurred while executing [@PostConstruct.]
javax.enterprise.inject.AmbiguousResolutionException: There is more than one api
type with : Foo with qualifiers : Qualifiers:
[@javax.enterprise.inject.Default()]
found beans:
Foo1, Name:null, WebBeans Type:MANAGED, API Types:[Foo,Foo1,java.lang.Object],
Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default]
Foo2, Name:null, WebBeans Type:MANAGED, API Types:[Foo,java.lang.Object,Foo2],
Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default]
     at
org.apache.webbeans.util.InjectionExceptionUtils.throwAmbiguousResolutionExceptionForBeans(InjectionExceptionUtils.java:121)
     at
org.apache.webbeans.util.InjectionExceptionUtils.throwAmbiguousResolutionException(InjectionExceptionUtils.java:111)
     at
org.apache.webbeans.container.ResolutionUtil.checkResolvedBeans(ResolutionUtil.java:80)
     at
org.apache.webbeans.inject.instance.InstanceImpl.get(InstanceImpl.java:110)
     at Main.init(Main.java:23)
"""

This exception happens when I call Provider.get().  I assumed that the Provider
interface would respect the Alternative Qualifiers, but that does not seem to be
the case.

Is this a bug in what I am doing, or a bug in OWB?

Thanks
Mike









-- Mike Olson



--
Mike Olson

Reply via email to