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

Другие вопросы по тегам