Инъекция в конструктор с помощью CDI + Weld - PullRequest
1 голос
/ 27 января 2020

Я хочу использовать Constructor Injection, поскольку это делает мои модульные тесты более безопасными и легкими для написания: я не могу забыть установить поля для инъекции. CDI поддерживает это, и javado c аннотации @Inject говорит: «@Inject является необязательным для publi c, конструкторов без аргументов, когда нет других конструкторов. Это позволяет инжекторам вызывать конструкторы по умолчанию».

Я понимаю, что другие стандарты требуют конструктора без аргументов (например, JAX-RS; см. этот вопрос ), что является обломом. Но даже для такого простого класса, как:

public class Bar {
    private final Foo foo;

    public Bar(Foo foo) {
        this.foo = foo;
    }
}

Сварка не удалась, сказав: DeploymentException: WELD-001408: Unsatisfied dependencies for type Bar. Когда я добавляю аннотацию @Inject, она работает.

Я действительно не ожидаю каких-либо ошибок в Weld, поскольку это уже давно установлено; Я, наверное, что-то не так понял. Но, возможно, это привлекло внимание только потому, что сообщество Jakarta EE просто не делает никаких инъекций в конструктор.

1 Ответ

2 голосов
/ 27 января 2020

Это не ошибка Weld. Как указывает спецификация , вам нужно @javax.inject.Inject в вашем конструкторе. Единственный раз, когда вам это не нужно, это когда у вас есть конструктор с нулевым аргументом, и вы не хотите sh для какого-либо другого конструктора вызываться контейнером.

...