ManagedProperty в CDI @Named bean возвращает ноль
Я пытаюсь разобраться с @ManagedProperty, но безуспешно!
Я следовал этому руководству, и это не кажется таким сложным. Но мой код просто не будет работать!
Вот небольшой фрагмент
@ManagedBean
@SessionScoped
public class LoginBean {
@EJB
private LoginUserLocal loginUser;
private boolean loggedIn = false;
private User user;
private StreamedContent image;
.
.
.
//--
@Named(value = "messagesBean")
@RequestScoped
public class MessagesBean {
@ManagedProperty(value = "#{loginBean}")
private LoginBean loginBean;
public LoginBean getLoginBean() {
return loginBean;
}
public void setLoginBean(LoginBean loginBean) {
this.loginBean = loginBean;
}
public String getUser() {
System.err.println(loginBean == null);
return loginBean.getUser().getUsername();
}
Этот код дает мне исключение NullPointerException, говоря, что loginBean имеет значение null!
Любое предложение?
1 ответ
Вы смешиваете управляемые компоненты JSF с компонентами CDI. Ваш LoginBean является управляемым компонентом JSF (он имеет @ManagedBean
аннотация). Ваш MessageBean является компонентом CDI (он имеет @Named
аннотация). Если вы изменили компонент сообщения на управляемый компонент JSF (замена @Named
с @ManagedBean
) тогда проблема должна быть решена (она должна работать и с двумя компонентами CDI).
Вот краткий обзор того, как инъекция работает между обоими типами бинов:
CDI @Named -> CDI @Named (работает)
CDI @Named -> JSF @ManagedBean (работает, только если область действия внедренного компонента шире)
JSF @ManagedBean -> JSF @ManagedBean (работает, только если область действия внедренного компонента шире)
JSF @ManagedBean -> CDI @Named (не будет работать)
Но позаботьтесь о классах импорта области. Есть разные классы для @SessionScoped
а также @RequestScoped
в зависимости от типа бобов.
javax.faces.bean.SessionScoped
для @ManagedBeans
javax.enterprise.context.SessionScoped
для CDI @Named beans
Кроме того, для @Named
(CDI) использование @Inject
и для @ManagedBean
использование @ManagedProperty
, Есть одна вещь, которая не работает в CDI. Ваш @ManagedProperty(value = "#{loginBean}")
получает полный боб, но @ManagedProperty(value = "#{loginBean.user}")
чтобы получить "свойство" боба работает. Это невозможно напрямую в CDI с @Inject
, Смотрите " Замена CDI для @ManagedProperty" для "решения".