ManagedProperty в CDI @Named bean возвращает ноль - PullRequest
19 голосов
/ 29 марта 2012

Я пытаюсь разобраться с @ 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 Ответ

38 голосов
/ 29 марта 2012

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

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

CDI @Named -> CDI @Named (работает)

CDI @Named -> JSF @ManagedBean (работает, только если область действия внедренного bean-компонента

JSF @ManagedBean -> JSF @ManagedBean (работает только в том случае, если область действия внедренного компонента шире)

JSF @ManagedBean -> CDI @Named (не работает)

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

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 для «решения»

...