#java #jakarta-ee
#java #джакарта-ee
Вопрос:
Я пытаюсь понять CDI. У меня есть интерфейс:
public interface Person {
public String getName();
}
И класс, который реализует Person
:
public class Male implements Person {
public Male() {}
@Override
public String getName() {
return "ra";
}
}
В основном классе я пытался:
public class Main {
@Inject
private Person person;
public static void main(String... args) {
System.out.println(new Main().person.getName());
}
}
но приведенный выше код приводит NPE
к person.getName()
. Я создал проект, используя maven, и область применения javaee
api является compile
. Что я делаю не так?
Ответ №1:
Похоже, вы пропускаете запуск контейнера CDI.
Обратите внимание, что любая аннотация к классу похожа на post-it. На самом деле это всего лишь дополнительная информация, а не реальный код. Эта информация должна быть интерпретирована. Это то, что делает контейнер CDI. Я написал вводную статью к CDI, в которой немного объясняются основы: https://jaxenter.com/tutorial-introduction-to-cdi-contexts-and-dependency-injection-for-java-ee-jsr-299-104536.html
Чего тебе не хватает:
1.) добавьте пустой META-INF/beans.xml файл. Или добавьте аннотацию области, подобную @ApplicationScoped
вашему Male.java
классу.
2.) добавьте контейнер CDI. Существует несколько вариантов. Если вы хотите использовать контейнер Apache OpenWebBeans CDI, то вы можете найти некоторую информацию здесь https://openwebbeans.apache.org/owbsetup_se.html Вы также можете найти рабочий пример здесь