Подтвердить что ты не робот

ManagedProperty в CDI @Named bean возвращает null

Я пытаюсь работать с @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!

Любое предложение?

4b9b3361

Ответ 1

Вы смешиваете управляемый JSF beans с CDI beans. Ваш LoginBean - это управляемый JSF bean (он имеет аннотацию @ManagedBean). Ваш MessageBean - это CDI bean (у него есть аннотация @Named). Если вы изменили сообщение bean на управляемый JSF bean (заменив @Named на @ManagedBean), тогда проблема должна быть решена (она также должна работать с двумя CDI beans).

Ниже приведен краткий обзор того, как инъекция работает между типами bean:

CDI @Named → CDI @Named (работает)

CDI @Named → JSF @ManagedBean (работает только в том случае, если объем вложенных bean шире)

JSF @ManagedBean → JSF @ManagedBean (работает только в том случае, если объем вложенных bean более широк)

JSF @ManagedBean → CDI @Named (не будет работать)

Но позаботьтесь о классах импорта области. Существуют разные классы для @SessionScoped и @RequestScoped в зависимости от типа bean.

javax.faces.bean.SessionScoped для @ManagedBeans

javax.enterprise.context.SessionScoped для CDI @Named beans