Как я могу получить объект на @WindowScoped?
В этом сообщении Динамический ui: include Я спросил, как я могу хранить объект в каком-либо состоянии, которое могло бы позволить мне загружать новые окна или вкладку тот же браузер, и он не был также сохранен в новых окнах. Адриан Митев сказал мне использовать @WindowScoped
, вариант расширения MyFaces под названием CODI, и я попытался его реализовать.
Теперь я должен сказать, что я слепой, и когда я пытался открыть Apache Wiki, мой браузер разбился на многих страницах, поэтому я не могу читать руководства.
Однако я добавляю исходный код в свой проект, и компилятор не дал никаких ошибок.
Проблема в том, что теперь страница, когда я пытаюсь восстановить bean, который я сохранил с помощью @WindowScoped
, не работает должным образом!
Я использую этот код в своем bean:
@ManagedBean (name="logicBean" )
@WindowScoped
В include.xhtml
я извлекаю параметр с помощью этого кода:
<ui:include src="#{logicBean.pageIncluded}"/>
И в моем другом beans я извлекаю LogicBean
с этим кодом (и я уверен, что проблема в этом коде)
LogicBean l = (LogicBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("logicBean");
Как я могу восстановить "правильный" объект LogicBean?
Ответы
Ответ 1
Вы пытаетесь получить LoginBean
с карты сеанса. Это работает только для сеансового beans со стандартной аннотацией JSF @SessionScoped
.
Канонический способ доступа к другим beans использует @ManagedProperty
для извлечения bean.
например.
@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);
// ...