Я использую WELD SE в автономном проекте java, который, казалось, работал нормально, пока я не начал использовать производителей.CDI (Weld SE) не впрыскивает внутренние зависимости при использовании метода производителя
Метод изготовления работает - контейнер использует его, но никогда не вводит внутренние зависимости производимого компонента. Когда я удаляю производителя, он работает нормально. Я не могу найти причину даже после длительного поиска в спецификации и в Google.
Пример Производитель:
@ApplicationScoped
public class LaminaValidadorProducer {
private static final String XSD_PATH = getConfig("processador.xsd.path");
private static final Map<VersaoLamina,String> XSD_PER_VERSION = new HashMap<>();
static {
XSD_PER_VERSION.put(VersaoLamina.V1, getConfig("processador.lamina.xsd.file"));
XSD_PER_VERSION.put(VersaoLamina.V2, getConfig("processador.laminav2.xsd.file"));
}
@Produces
public LaminaValidador buildValidador() {
return new LaminaValidador(XSD_PATH, XSD_PER_VERSION);
}
}
LaminaValidador вводят, как правило, но его внутренней атрибуты (отмеченные @Inject) не впрыскивают. В проекте есть beans.xml с bean-discovery-mode = "all".
Любые подсказки о том, что происходит?
Позор мне - основной материал, о котором я не знал. Спасибо. Мне никогда не приходилось создавать производителя бобов с внутренними зависимостями, отмеченными с помощью @Inject, поэтому он всегда работал - в моей голове, как только вы передали аргументы конструктору, CDI продолжит вводить атрибуты, помеченные явно с помощью Inject. Это было бы трудно реализовать, поэтому я считаю, что поведение структуры правильное. –
Я мог бы решить проблему, обернув эту карту (см. Мой пост) в другом классе (без дополнительных зависимостей). Итак, я создал производителя этого класса (который отлично работает), а затем @ ввел его в конструктор LaminaValidador через конструктор. Теперь работает как шарм. Еще раз спасибо. –
Рад, что я мог помочь!BTW-упаковка с другим классом действительно работает, но вы также можете создать метод-производитель, который даст вам карту (и в теле метода вы инициализируете его, как хотите). Такой метод продления может находиться в том же классе, который у вас есть. Затем вы можете вставлять карту в любом месте, включая конструктор вашего класса LaminaValidador' (например, [с использованием вставки конструктора] (http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#declaring_bean_constructor)) , – Siliarus