Как я могу получить объект на @WindowScoped?
В этом посте Dynamic ui:include я спросил, как я могу сохранить объект в каком-то состоянии, которое может позволить мне загрузить новые окна или вкладку того же браузера, и он не был сохранен и в новых окнах. Адриан Митев сказал мне, чтобы использовать @WindowScoped
, вариант расширения MyFaces под названием CODI, и я попытался реализовать его.
Теперь я должен сказать, что я слепой, и когда я пытался открыть Apache Wiki, мой браузер зависает на многих страницах, поэтому я не могу прочитать руководства.
Однако я добавил исходный код в свой проект, и компилятор не выдал никаких ошибок. Проблема в том, что теперь страница, когда я пытаюсь получить бин, который я сохранил @WindowScoped
не работает должным образом!
Я использую этот код в моем бине:
@ManagedBean (name="logicBean" )
@WindowScoped
В include.xhtml
Я получаю параметр с этим кодом:
<ui:include src="#{logicBean.pageIncluded}"/>
И в других моих бобах я получаю LogicBean
с этим кодом (и я уверен, что проблема в этом коде)
LogicBean l = (LogicBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("logicBean");
Как я могу получить "правильный" объект LogicBean?
1 ответ
Вы пытаетесь получить LoginBean
с карты сеанса. Это работает только для сессионных бинов с областью действия со стандартным JSF @SessionScoped
аннотаций.
Канонический способ доступа к другим бинам использует @ManagedProperty
на бобе извлечения.
Например
@ManagedBean
@RequestScoped
public class OtherBean {
@ManagedProperty("#{logicBean}")
private LogicBean logicBean;
// Getter+Setter.
}
Если вам действительно нужен доступ к нему внутри блока метода путем программной оценки EL, вы должны использовать Application#evaluateExpressionGet()
вместо:
FacesContext context = FacesContext.getCurrentInstance();
LogicBean logicBean = context.getApplication().evaluateExpressionGet(context, "#{logicBean}", LogicBean.class);
// ...