Как внедрить объекты со списком в качестве аргумента конструктора, используя picocontainer? - PullRequest
1 голос
/ 06 апреля 2020

У меня есть класс, который принимает аргумент списка в своем конструкторе:

 public class A{

    private List<B> bs;

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

И я добавляю этот класс в контейнер следующим образом:

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

Но я получаю исключение:

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<|

Кто-нибудь знает, почему это происходит?

Код композиции:

        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 Ответ

2 голосов
/ 04 мая 2020

Эта ошибка означает, что у вас нет класса B, зарегистрированного в контейнере. Должно быть что-то вроде:

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

'B' также может быть интерфейсом, и Picocontainer поддерживает внедрение массивов с зависимостями, поэтому это будет работать:

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);

Проверьте также официальный тестовый пример: https://github.com/picocontainer/picocontainer/blob/0f8172b7b12483920d0e3e2fcadb793d7ead4432/script/script-core/src/test/com/picocontainer/script/xml/XMLContainerBuilderTestCase.java#L868

...