Search code examples
javadependency-injectionparameter-passingcdiinject

How to pass parameter to injected class from another class in CDI?


I am new to CDI, tried to find solution for this question, but, couln't found any. Question is Suppose I have one class which is being injected(A) from, where some value(toPass) is getting injected, now I want to pass this same value(toPass) to class B, which is getting injected from class A.

public class A 
{
    String toPass = "abcd"; // This value is not hardcoded

    @Inject
    private B b;
}

public class B 
{
    private String toPass; 
    public B(String toPass)
    {
        toPass = toPass;
    }
}

Can anybody please help me in this? Note: we cannot initialize the toPass variable of B in the same way as we have initialized in A, there is some restriction to it. Basically in Spring we could have done it easily, but, I wanted to do it in CDI.


Solution

  • You have options:

    1. Set toPass variable to b from @PostConstruct method of bean A:

    @PostConstruct
    public void init() {
        b.setToPass(toPass);
    }
    

    or

    2. Create producer for toPass variable and inject it into bean A and B.

    Producer:

    @Produces
    @ToPass
    public String produceToPass() {
        ...
        return toPass;
    }
    

    Injection:

    @Inject
    @ToPass
    String toPass; 
    

    or

    3. If bean A is not a dependent scoped bean you can use Provider interface to obtain an instance of bean A:

    public class B  
    {
        @Inject
        Provider<A> a;
    
        public void doSomeActionWithToPass() {
            String toPass = a.get().getToPass());
            ...
        }
    

    But you should not use toPass from constructor or from @PostConstruct method.