Вы смешиваете управляемые компоненты 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 для «решения»