Search code examples
javajakarta-eedependency-injectioncdijboss-weld

Ambiguous dependency while using @Produces annotation


I have been studying @Produces annotation of CDI dependency injection from here. I just created my own same example. However, I am facing with ambiguous dependency.

public interface Bank {

    public void withdrawal();
    public void deposit();
}

public class BankOfAmerica implements Bank {

    @Override
    public void withdrawal() {
        System.out.println("Withdrawal from Bank of America");
    }

    @Override
    public void deposit() {
        System.out.println("Deposit to Bank of America");
    }
}

public class BankFactory {

    @Produces
    public Bank createBank() {
        return new BankOfAmerica();
    }
}

And this is the class which bean is get injected.

public class ProducesExample {

    @Inject
    private Bank bankOfAmerica;

    public void callBanksWithdrawal() {
        bankOfAmerica.withdrawal();
    }
}

I appreciate for any help.

EDIT: I know this a kind of duplicate of this question. However, in the tutorial which I shared, it says it should work. Moreover, there is only one type of bean so no need use @Default or @Alternatives but still get confused about why it is not working.


Solution

  • The tutorial is a bit ambiguous (pun intended) about which classes should be deployed simulataneously in each step, so I wouldn't worry about that too much.

    The answer to the other question you linked does match your case. BankOfAmerica is a bean of type Bank (in CDI 1.0 or in CDI 1.1+ with explicit beans), and your producer method is another bean of the same type, hence the ambiguous resolution.