1 Reply Latest reply: Feb 22, 2011 1:58 AM by Stuart Douglas RSS

Programmatic selection fails with UnsatisfiedResolutionException

Sebastian Hennebrueder Newbie

I have two classes implementing FooInterface: FooAImpl and FooBImpl. FooAImpl has a qualifier (@FooA)


@FooA 
public class FooAImpl implements FooInterface{
     @Override
     public void sayHello() {
          System.out.println("A says hello");
     }
}



Injecting FooA with qualifier and FooB without qualifier works fine.


public class SomeService {

     @Inject @FooA
     private FooInterface fooInterface;

     public void hello(){
          fooInterface.sayHello();
     }
}

// call example
weldContainer.instance().select(SomeService.class).get().hello();



But the following does not work.


final FooInterface fooA = weldContainer.instance().select(FooInterface.class,
                    new FooA.FooALiteral()).get();

org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308 Unable to resolve any beans for Types: [interface de.laliluna.beans.FooInterface]; Bindings: [@javax.enterprise.inject.Default(), @de.laliluna.beans.FooA()]
     at org.jboss.weld.manager.BeanManagerImpl.getBean(BeanManagerImpl.java:809)



The FooALiteral works as I can use the following delegate class to select the FooA implemenation


public static class FooDelegate{
          @Inject  @Any
          private Instance<FooInterface> instances;

          public Instance<FooInterface> getInstances() {
               return instances;
          }
     }

// used by
FooDelegate select = weldContainer.instance().select(FooDelegate.class).get();
final FooInterface fooInterface = select.getInstances().select(new FooA.FooALiteral()).get();



What is wrong with my code and is there any direct way to select a qualified instance programmatically?


Best Regards / Viele Grüße


Sebastian