CDI для типа вызывает NPE

#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 Вы также можете найти рабочий пример здесь