Исключение 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()); } }
Однако это исключает следующее:
- Как обрабатывать завершение сеанса и ViewExpiredException в JSF 2?
- Как и когда я должен загрузить модель из базы данных для h: dataTable
- Как ссылаться на ресурс изображений JSF как URL-адрес фонового изображения CSS
- Теги JSF не отображаются как HTML
- Как перемещаться в JSF? Как сделать URL-адрес текущей страницы (а не предыдущей)
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) ...
Как это вызвано и как я могу его решить?
- что не является областью видимости и когда ее использовать?
- Понять Flash Scope в JSF2
- Исключение обработчика уровня сервиса в интерфейсе Java EE
- JSTL в JSF2 Facelets ... имеет смысл?
- Весенние сеансовые компоненты (controllerы) и ссылки на службы с точки зрения сериализации
- Условно отображение компонентов JSF
- JSF динамически включает src в "ui: include src =" # {bean.pagePath} "
- Подтвердить ограничения валидации компонентов уровня classа в JSF
Вы ожидаете, что введенная зависимость доступна до того, как будет создан компонент. Вы ожидаете, что он работает следующим образом:
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()