How to inject objects with list as an constructor argument using picocontainer?

449 Views Asked by At

I have a class which takes an list argument in its contructor:

 public class A{

    private List<B> bs;

    public A(List<B> bs) {
        this.bs= bs;
    } 
}

And I am adding this class in the container as follows:

    A a = someObject.createData();
    pico.addComponent(a);

But I am getting an exception:

org.picocontainer.injectors.AbstractInjector$UnsatisfiableDependenciesException: A has unsatisfied dependency 'java.util.List<B>' for constructor 'public A(java.util.List)' from org.picocontainer.DefaultPicoContainer@5b970f7:6<|

Does anyone know why this is happening?

Composition Code:

        MutablePicoContainer pico = new DefaultPicoContainer();
        SomeClass sc= new SomeClass();
        A a = sc.createbData();
        pico.addComponent(sc);
        pico.addComponent("bs", a.getB());
        pico.addComponent("a", A.class);
1

There are 1 best solutions below

4
On

This error means that you don't have class 'B' registered in container. There should be something like:

B b = new B();
pico.addComponent(b);

'B' can be an interface too, and Picocontainer supports injection of arrays with dependencies, so this will work:

public interface B {}
public class B1 implements B {}
public class B2 implements B {}

public class Test {

    private List<B> stores;

    public Test(List<B> stores) {
        this.stores=stores;
    }
}

pico.addComponent("b1",B1.class);
pico.addComponent("b2",B2.class);
pico.addComponent("test",Test.class);

Check also an official test case: https://github.com/picocontainer/picocontainer/blob/0f8172b7b12483920d0e3e2fcadb793d7ead4432/script/script-core/src/test/com/picocontainer/script/xml/XMLContainerBuilderTestCase.java#L868