Исключение NullPointerException при попытке доступа к объекту @Inject в конструкторе

У меня есть бонусный сеанс:

@Named @SessionScoped public class SessionBean implements Serializable { private String someProperty; public String getSomeProperty() { return someProperty; } } 

Я хотел бы добавить это в бланк с запросом и инициализировать его:

 @Named @RequestScoped public class RequestBean { @Inject private SessionBean sessionBean; public RequestBean() { System.out.println(sessionBean.getProperty()); } } 

Однако это исключает следующее:

 java.lang.NullPointerException at com.example.RequestBean.(RequestBean.java:42) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at org.jboss.weld.introspector.jlr.WeldConstructorImpl.newInstance(WeldConstructorImpl.java:206) at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:117) at org.jboss.weld.bean.ManagedBean.createInstance(ManagedBean.java:336) at org.jboss.weld.bean.ManagedBean$ManagedBeanInjectionTarget.produce(ManagedBean.java:200) at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:292) ... 

Как это вызвано и как я могу его решить?

Вы ожидаете, что введенная зависимость доступна до того, как будет создан компонент. Вы ожидаете, что он работает следующим образом:

 RequestBean requestBean; requestBean.sessionBean = sessionBean; // Injection. requestBean = new RequestBean(); // Constructor invoked. 

Это, однако, не так и технически невозможно. Зависимости вводятся после строительства.

 RequestBean requestBean; requestBean = new RequestBean(); // Constructor invoked. requestBean.sessionBean = sessionBean; // Injection. 

@PostConstruct этого вы должны использовать метод @PostConstruct если вы намереваетесь выполнять бизнес-логику на основе вложенных зависимостей непосредственно после построения bean-компонента.

Удалите конструктор и добавьте этот метод:

 @PostConstruct public void init() { System.out.println(sessionBean.getSomeProperty()); } 

Ответ BalusC верен, но отражает фазу назначения создания объекта, которая не выполнялась в это время. Но в любом случае компонент CDI должен быть доступен, если вы программно его программно:

 javax.enterprise.inject.spi.CDI.current().select(SessionBean.class).get() 
  • Как отображать ошибки моего приложения в JSF?
  • Как установить -Dorg.apache.el.parser.COERCE_TO_ZERO = false программно
  • Как использовать шрифт Awesome с webjars.org с JSF
  • java.lang.NoClassDefFoundError: javax / servlet / jsp / jstl / core / Config
  • Как я могу получить строку пакета сообщений из управляемого управляемого компонента?
  • Динамически генерировать h: столбец на основе списка hashmaps
  • JSF 2: Как показать другой статус ajax в одном входе?
  • Вход в сеанс HTTP JSF
  • Разница между Моджаррой и MyFaces
  • Как аннулировать сеанс пользователя, когда он дважды регистрируется с одинаковыми учетными данными
  • Добавление jQuery в PrimeFaces приводит к тому, что Uncaught TypeError по всему месту
  • Interesting Posts

    Добавить пользовательское поле / столбец для разработки с помощью Rails 4

    Что написано на стороне «ключа тайны» на клавиатуре IBM PC 3180?

    Как изменить цвет полосы прокрутки с помощью css

    R конвертировать zipcode или lat / long в графство

    Webrick очень медленно реагирует. Как ускорить его?

    Serial Comm с использованием WriteFile / ReadFile

    SSH обратный туннель в контейнер Docker

    Как установить проигрыватель VMware на Mac OS X?

    Задание полей в LinearLayout программно

    LINQ to Entities не распознает метод Int32 get_Item (Int32)

    Почему файловые менеджеры не используют таблицу основных файлов для мгновенного поиска?

    Форматирование даты и времени с помощью iPhone SDK?

    Как рассчитать количество дней между двумя датами

    Скопируйте все установленные программы и файлы на жесткий диск (который имеет 32-битную Windows 7) и клонируйте / перенесите его на другой компьютер с 64-разрядной версией Windows 7

    как инициализировать ‘const std :: vector ‘ как ac array

    Давайте будем гением компьютера.